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 -ccon -ro -unon ha funzionato nel mio caso. Il messaggio di errore eratar: Cannot update compressed archives
usando entrambi -re -unon è valido e falliscetar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
anche la sostituzione -ccon -asembra non essere valida e fallisce con lo stesso tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' optionsanche se non riconosco il problema azfe Acdtruxmi 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 -print0un'opzione per usare un byte null come delimitatore invece di una nuova riga. sortposso gestirlo con la -zbandiera. head, sfortunatamente non gestisce capire i delimitatori di byte nulli, ma questa risposta ha una soluzione che usa trper scambiare \ne \0prima e dopo head. tardeve --null -T -leggere i nomi di file delimitati da null da stdin.