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à gunzipmolti ma non troppi nomi di file sulla sua riga di comando. Questo è più efficiente di quello -exec gunzip {} \;che avvia un nuovo gunzipprocesso per ogni singolo file.
find, meno gunzip!
findconsentono la notazione "+". Vedi, ad esempio, la findpagina 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.
xargsriempirà tutti i nomi di file che rientrano nella gunzipriga di comando. Provalo! echo a b c d e f | xargs echoinvoca solo echouna volta con tutti e 6 gli argomenti in modo da vedere una riga di output (comando abbastanza inutile da eseguire comunque !!!!) mentre se forzate xargsa fornire solo fino a 3 argomenti per invocazione del comando usando echo a b c d e f | xargs -n 3 echoallora otterrete 2 righe di output .
xargsè che, con l' -Popzione, è possibile eseguire più gunzipprocessi 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 "{}" \;
findcon +e xargssono 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 {} \;
gunzipuna 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 gunzipnon massimizzerà le capacità della tua macchina. Per questo dovresti eseguire più gunzips 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?
findriga di comando di.
-name
Non è necessario usarlo findper questo, poiché non hai menzionato le sottocartelle. Quello che devi fare è:
for f in *.gz;do gunzip $f;done
findse non si vuole generare 320116 gunzipprocessi, proprio come questo ciclo fa.