GNU/Linux >> Belajar Linux >  >> Linux

Cara menggabungkan perintah 'tar' dengan 'find'

Anda dapat menggunakan sesuatu seperti:

find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -

-print0 dan -T bekerja sama untuk mengizinkan nama file dengan spasi baris baru, dll. - terakhir memberi tahu tar untuk membaca nama file masukan dari stdin.

Perhatikan bahwa -print0 harus ada di akhir pernyataan Anda, per jawaban ini. Jika tidak, Anda mungkin akan mendapatkan lebih banyak file dari yang Anda harapkan.


Catatan: Lihat jawaban @Iain untuk solusi yang lebih efisien.

Perhatikan bahwa find akan memanggil -exec tindakan untuk setiap file ia menemukan.

Jika Anda menjalankan tar -cvf file.tar {} untuk setiap file find output, ini berarti Anda akan menimpa file.tar setiap kali, yang menjelaskan mengapa Anda berakhir dengan satu arsip tersisa yang hanya berisi anaconda.storage.log — ini adalah file terakhir find keluaran.

Sekarang, Anda sebenarnya ingin menambahkan file ke arsip alih-alih membuatnya setiap kali (ini adalah -c opsi tidak). Jadi, gunakan yang berikut ini:

find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;

-r opsi ditambahkan ke arsip alih-alih membuatnya kembali setiap saat.

Catatan: Ganti -iname anaconda.* dengan -iname "anaconda.*" . Tanda bintang adalah karakter pengganti dan dapat diperluas oleh shell Anda sebelum find bahkan melihatnya. Untuk mencegah perluasan ini, bungkus argumen dalam tanda kutip ganda.

Adapun tar menghapus / di depan :Arsip hanya boleh berisi relatif nama file. Jika Anda menambahkan file dengan / di depan , mereka akan disimpan sebagai mutlak nama file, secara harfiah berarti /var/… di komputer Anda, misalnya.

IIRC ini hanyalah tindakan pencegahan untuk tar implementasi selain GNU, dan cara ini lebih aman karena Anda tidak akan menimpa data aktual Anda di /var/… ketika Anda mengekstrak arsip jika berisi nama file relatif.


Coba ini:

tar -cvf file.tar `find var/log/ -iname "anaconda.*"`

Anda mencoba menggunakan find ke -exec tar . Tapi cara -exec opsi berfungsi, ia menjalankan perintah itu sekali untuk setiap file yang cocok yang ditemukannya, menyebabkan tar untuk menimpa file tar yang dihasilkannya setiap kali. Itu sebabnya Anda hanya berakhir dengan yang terakhir. Selain itu, Anda perlu memberi tanda kutip pada pola yang Anda tentukan ke find sehingga shell tidak mengembangkannya sebelum meneruskannya ke find .

Menggunakan substitusi perintah dengan backticks (atau menggunakan $(...) notasi jika Anda mau), seluruh daftar nama dihasilkan oleh find disisipkan kembali ke baris perintah sebagai argumen ke tar , menyebabkannya menulis semuanya sekaligus.


Linux
  1. Temukan file dan direktori di Linux dengan perintah find

  2. Bagaimana cara menambahkan output ke file?

  3. tr perintah - cara mengganti string \n dengan baris baru yang sebenarnya (\n)

  1. Cara Menggunakan Perintah Tar di Linux

  2. Cara Mengekstrak File tar.gz di Linux dengan Menggunakan Command Line

  3. Cara mengaudit izin dengan perintah find

  1. Bagaimana Menemukan Proses Dengan Deskriptor File Maksimum?

  2. Membuka file .tar.gz dengan satu perintah

  3. Bagaimana menemukan pengelola file default?