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.