Saya memiliki folder dengan sekitar 20 ribu file. File-file tersebut dinamai sesuai dengan pola xy_{\d1,5}_{\d4}\.abc
, misalnya xy_12345_1234.abc
. Saya ingin mengompresi 10K pertama dari mereka menggunakan perintah ini:
ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz
namun file yang dihasilkan hanya memiliki sekitar 2K file di dalamnya.
ls | sort -n -k1.4,1.9 | head -n10000 | wc -l
namun mengembalikan 10.000, seperti yang diharapkan.
Sepertinya saya salah paham tentang sesuatu yang mendasar di sini ...
Saya menggunakan zsh 5.0.2 di Linux Mint 17.1, GNU tar 1.27.1
EDIT:
forking seperti yang disarankan oleh @Archemar terdengar sangat masuk akal, dengan garpu terbaru menimpa file yang dihasilkan - file tersebut berisi 'ekor' file - 7773 hingga 9999 .
hasil dari xargs --show-limit
:
Your environment variables take up 3973 bytes
POSIX upper limit on argument length (this system): 2091131
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2087158
Size of command buffer we are actually using: 131072
mengganti -c
dengan -r
atau -u
tidak berfungsi dalam kasus saya. Pesan kesalahan tadinyatar: Cannot update compressed archives
menggunakan keduanya -r
dan -u
tidak valid dan gagal dengantar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
mengganti -c
dengan -a
tampaknya tidak valid juga dan gagal dengan yang sama tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
meskipun saya tidak mengenali masalah ini azf
dan Acdtrux
tampak terpisah bagi saya.
EDIT 2:
-T sepertinya cara yang baik, saya juga menemukan contoh di sini .
Namun ketika saya coba
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T -
saya mendapat
tar: option requires an argument -- 'T'
baik, mungkin nama file tidak mencapai tar? Tapi sepertinya mereka, lakukan karena ketika aku mengeksekusinya
ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T -
saya mendapat
tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab
Cannot stat: File name too long
Jadi mengapa tar tidak melihat nama file?
ls
find
, yang memiliki -print0
opsi untuk menggunakan byte nol sebagai pembatas, bukan baris baru. sort
dapat mengatasinya dengan -z
bendera. head
, sayangnya tidak menangani mengerti pembatas byte nol, tetapi jawaban ini memiliki solusi menggunakan tr
untuk swap \n
dan \0
sebelum dan sesudah head
. tar
harus --null -T -
membaca nama file yang dibatasi nol dari stdin
.