Bagaimana membuat tar terkompresi ketika ada terlalu banyak nama file untuk diekspansi pada satu baris?

5

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 -zopsi karena Anda tidak dapat menambahkan ke arsip terkompresi, dan menggunakan -calih-alih -rakan 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.

Komandan Kode
sumber
4
Anda dapat membuat arsip tar dan mengompresnya nanti. (Seperti dulu cara kami melakukan hal-hal kembali ketika kami berjalan menanjak ke sekolah, dua arah).
Hennes
3
Perintah find Anda menderita masalah yang sama dengan terlalu banyak argumen sejak glob diperluas sebelum find melihatnya. Anda harus menggunakannya find -name '*.csv'sebagai gantinya.
slhck
Memang, saya memperbaikinya sekarang.
Code Commander

Jawaban:

7

Sebagai solusi yang kuat, gunakan finduntuk memisahkan nama file dengan karakter nol, dan kemudian pipa langsung ke tar, yang bertuliskan input nol-dibatasi :

find . -name '*.csv' -maxdepth 1 -print0 |
tar -czf archive.tgz --null -T -

Ini sekarang akan menangani semua nama file dengan benar dan tidak dibatasi oleh jumlah file juga.

Menggunakan lsuntuk menghasilkan daftar nama file yang akan diuraikan oleh program lain adalah antipattern umum yang harus dihindari bila memungkinkan. finddapat 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.

slhck
sumber
9

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:

ls *.csv > temp.txt
tar -zcf ball.tgz -T temp.txt

@ 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:

ls *.csv | sed -e 's/^\(.*\)$/"\1"/' > temp.txt
tar -zcf ball.tgz -T temp.txt

(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. :)

dg99
sumber
2
Jika Anda ingin melakukannya dalam satu perintah, Anda dapat menggunakan tar -zcf ball.tgz -T <( ls *.csv)atau tar -zcf ball.tgz -T <( find -name '*.csv'). Lihat tldp.org/LDP/abs/html/abs-guide.html#PROCESS-SUB
Zoredache
Itu bukan solusi yang saya pikirkan. Lihat jawaban saya untuk solusi yang tidak mencekik nama file. Jangan salahkan pengguna untuk membuat file dengan spasi atau tanda kutip ganda di path - semua alat Linux dapat menangani ini dengan benar, Anda hanya perlu menerapkan opsi yang tepat. Secara umum, sebagai tip yang baik, setelah Anda menemukan diri Anda menggunakan lsuntuk menghitung file selain hanya melihat mereka, sesuatu mungkin akan rusak.
slhck