Ho una cartella contenente circa 320116 file .pdb.gz. Voglio decomprimerli tutti. Se uso gunzip * .gz mi dà un errore, ovvero un elenco di argomenti troppo lungo. La cartella è di circa 2 GB. Per favore, dammi un suggerimento appropriato.
Ho una cartella contenente circa 320116 file .pdb.gz. Voglio decomprimerli tutti. Se uso gunzip * .gz mi dà un errore, ovvero un elenco di argomenti troppo lungo. La cartella è di circa 2 GB. Per favore, dammi un suggerimento appropriato.
Risposte:
find . -name '*.pdb.gz' -exec gunzip {} +
-exec gunzip {} +
fornirà gunzip
molti ma non troppi nomi di file sulla sua riga di comando. Questo è più efficiente di quello -exec gunzip {} \;
che avvia un nuovo gunzip
processo per ogni singolo file.
find
, meno gunzip
!
find
consentono la notazione "+". Vedi, ad esempio, la find
pagina man di BSD 10.1 . Vale anche per OS X (almeno 10.9 e successive, forse precedenti).
Ogni volta che si ottengono errori "Elenco argomenti troppo lungo" è possibile aggirare il problema invocando il comando desiderato più volte, ogni volta con un sottoinsieme degli argomenti che si desidera utilizzare. xargs
è uno strumento che ti aiuta a farlo automaticamente.
find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip
-execdir gunzip "{}" \;
che xargs invocherà gunzip separatamente per ogni file? Questa è la mia lettura della pagina man.
xargs
riempirà tutti i nomi di file che rientrano nella gunzip
riga di comando. Provalo! echo a b c d e f | xargs echo
invoca solo echo
una volta con tutti e 6 gli argomenti in modo da vedere una riga di output (comando abbastanza inutile da eseguire comunque !!!!) mentre se forzate xargs
a fornire solo fino a 3 argomenti per invocazione del comando usando echo a b c d e f | xargs -n 3 echo
allora otterrete 2 righe di output .
xargs
è che, con l' -P
opzione, è possibile eseguire più gunzip
processi in parallelo, che (a seconda dei parametri esatti del sistema) potrebbe andare più veloce.
-P
, @psmears. Ora ho imparato anche qualcosa!
Penso che dovrebbe funzionare, passa il percorso / nome di ogni file singolarmente a gunzip per l'elaborazione:
find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;
find
con +
e xargs
sono espressamente designer con esattamente quel problema in mente. Forniranno sempre quanti più argomenti possibile, pur non superando il limite del sistema operativo. Perché, a proposito, è un limite del sistema operativo, niente a che fare con gunzip
.
Prova in questo modo:
find . -name '*.gz' -exec gunzip {} \;
gunzip
una volta per file. Vedi la risposta di John1024 per un modo leggermente diverso che evita quell'inefficienza.
Se hai una macchina multi-core probabilmente vedrai che l'utilizzo gunzip
non massimizzerà le capacità della tua macchina. Per questo dovresti eseguire più gunzip
s in parallelo. Tenere traccia di ciò che viene fatto in quale terminale a mano è ingombrante, ma puoi farlo facilmente con GNU parallelo:
find . -name "*.gz" | parallel -X gunzip {}
parallel
è troppo lungo?
find
è troppo lungo?
find
riga di comando di.
-name
Non è necessario usarlo find
per questo, poiché non hai menzionato le sottocartelle. Quello che devi fare è:
for f in *.gz;do gunzip $f;done
find
se non si vuole generare 320116 gunzip
processi, proprio come questo ciclo fa.