Biasanya saya hanya akan melakukan sesuatu seperti:
tar -czf archive.tar.gz *.csv
Tetapi ketika ada terlalu banyak file di direktori untuk memperluas shell pada satu baris ini tidak berfungsi.
Dalam kasus ini saya biasanya akan menggunakan find
. Sesuatu seperti:
find /path -name '*.csv' -exec tar -rf "./archive.tar.gz" {} +;`
Tapi ini hanya berfungsi jika saya tidak menyertakan -z
opsi karena Anda tidak dapat menambahkan ke arsip terkompresi, dan menggunakan -c
alih-alih -r
akan menimpa arsip pertama sejak menemukan menjalankan tar beberapa kali.
Satu-satunya solusi lain yang bisa saya buat adalah dengan membuat file .tar dengan find
(seperti di atas) dan kemudian menggunakan perintah kedua untuk mengompresnya. Apakah ada cara yang lebih baik untuk menangani kasus seperti ini?
Saya menggunakan Ubuntu Linux.
find -name '*.csv'
sebagai gantinya.Jawaban:
Sebagai solusi yang kuat, gunakan
find
untuk memisahkan nama file dengan karakter nol, dan kemudian pipa langsung ketar
, yang bertuliskan input nol-dibatasi :Ini sekarang akan menangani semua nama file dengan benar dan tidak dibatasi oleh jumlah file juga.
Menggunakan
ls
untuk menghasilkan daftar nama file yang akan diuraikan oleh program lain adalah antipattern umum yang harus dihindari bila memungkinkan.find
dapat menghasilkan keluaran dengan pembatas nol (-print0
) yang dapat dibaca atau diurai sebagian besar utilitas. Karena karakter nol adalah satu-satunya karakter yang tidak dapat muncul dalam nama file (dan/
, tentu saja), Anda akan selalu aman dengan itu.sumber
Tidak, Anda tidak dapat menambahkan file tar terkompresi tanpa mengompresnya terlebih dahulu.
Namun, tar dapat menerima daftar file untuk diproses dari file , jadi Anda bisa melakukan:
@ Slhck menunjukkan bahwa solusi di atas tidak akan berfungsi jika ada spasi (dan mungkin karakter menjengkelkan lainnya) di nama file Anda. Versi ini menyertakan setiap nama file dalam tanda kutip ganda:
(Ini tentu saja akan pecah jika Anda memiliki tanda kutip ganda dalam nama file Anda, dalam hal ini Anda mendapatkan apa yang pantas Anda dapatkan. :)
sumber
tar -zcf ball.tgz -T <( ls *.csv)
atautar -zcf ball.tgz -T <( find -name '*.csv')
. Lihat tldp.org/LDP/abs/html/abs-guide.html#PROCESS-SUBls
untuk menghitung file selain hanya melihat mereka, sesuatu mungkin akan rusak.