Ho una cartella con circa 20K file. I file vengono denominati in base al modello xy_{\d1,5}_{\d4}\.abc
, ad es xy_12345_1234.abc
. Volevo comprimere i primi 10K usando questo comando:
ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz
tuttavia il file risultante conteneva solo circa 2K file all'interno.
ls | sort -n -k1.4,1.9 | head -n10000 | wc -l
tuttavia restituisce 10000, come previsto.
Mi sembra di aver frainteso qualcosa di semplice qui ...
Sto usando zsh 5.0.2 su Linux Mint 17.1, GNU tar 1.27.1
MODIFICARE:
il fork come suggerito da @Archemar sembra molto plausibile, con l'ultimo fork che sovrascrive il file risultante - il file contiene la 'coda' dei file - da 7773 a 9999 .
risultato di 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
la sostituzione -c
con -r
o -u
non ha funzionato nel mio caso. Il messaggio di errore eratar: Cannot update compressed archives
usando entrambi -r
e -u
non è valido e falliscetar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
anche la sostituzione -c
con -a
sembra non essere valida e fallisce con lo stesso tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
anche se non riconosco il problema azf
e Acdtrux
mi sembra disgiunto.
MODIFICA 2:
-T sembra un buon modo, ho anche trovato un esempio qui .
Comunque quando ci provo
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T -
ottengo
tar: option requires an argument -- 'T'
bene, forse i nomi dei file non raggiungono il catrame? Ma sembra che lo facciano perché quando eseguo
ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T -
ottengo
tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab
Cannot stat: File name too long
Allora perché tar non vede i nomi dei file?
ls
find
, che ha -print0
un'opzione per usare un byte null come delimitatore invece di una nuova riga. sort
posso gestirlo con la -z
bandiera. head
, sfortunatamente non gestisce capire i delimitatori di byte nulli, ma questa risposta ha una soluzione che usa tr
per scambiare \n
e \0
prima e dopo head
. tar
deve --null -T -
leggere i nomi di file delimitati da null da stdin
.