Questo è per lo più fuori tema, ma potresti usarlo
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Il vantaggio principale qui (oltre ... xargs ... -I {} ... sed ...
) è la velocità: eviti di invocare sed
10 milioni di volte. Sarebbe ancora più veloce se tu potessi evitare di usare Python (dato che python è un po 'lento, relativamente), quindi perl potrebbe essere una scelta migliore per questo compito. Non sono sicuro di come fare l'equivalente convenientemente con il perl.
Il modo in cui funziona è che xargs
invocherà Python con tutti gli argomenti che può stare su una singola riga di comando e continuerà a farlo fino a quando non si esauriscono gli argomenti (che vengono forniti da ls -f *.txt
). Il numero di argomenti per ogni invocazione dipenderà dalla lunghezza dei nomi dei file e, um, da alcune altre cose. La fileinput.input
funzione produce righe successive dai file indicati negli argomenti di ogni invocazione e l' inplace
opzione dice di "catturare" magicamente l'output e usarlo per sostituire ogni riga.
Nota che il replace
metodo stringa di Python non usa regexps; se ne hai bisogno, devi import re
e usalo print re.sub(line, "blah", "blee")
. Sono RegExps compatibili con Perl, che sono una specie di versioni fortemente fortificate di quelle che ottieni sed -r
.
modificare
Come Akira menziona nei commenti, la versione originale che utilizza un glob ( ls -f *.txt
) al posto del find
comando non funzionerebbe perché i globs vengono elaborati dalla shell ( bash
) stessa. Ciò significa che prima ancora che il comando venga eseguito, nella riga di comando verranno sostituiti 10 milioni di nomi di file. Questo è praticamente garantito per superare la dimensione massima dell'elenco di argomenti di un comando. È possibile utilizzare xargs --show-limits
per informazioni specifiche del sistema su questo.
Viene inoltre presa in considerazione la dimensione massima dell'elenco degli argomenti xargs
, che limita il numero di argomenti che passa a ciascuna invocazione di Python in base a tale limite. Dato che xargs
dovrà ancora invocare Python parecchie volte, il suggerimento di Akira da usare os.path.walk
per ottenere l'elenco dei file probabilmente ti farà risparmiare un po 'di tempo.
sed
per ogni file. Non sono sicuro che esista un modo per aprire, modificare, salvare e chiudere una serie di filesed
; se la velocità è essenziale, potresti voler usare un programma diverso, forse perl o python.