Ceci est principalement hors sujet, mais vous pouvez utiliser
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Le principal avantage ici (sur ... xargs ... -I {} ... sed ...
) est la vitesse: vous évitez d'invoquersed
10 millions de fois. Ce serait encore plus rapide si vous pouviez éviter d'utiliser Python (car python est un peu lent, relativement), donc perl pourrait être un meilleur choix pour cette tâche. Je ne sais pas comment faire l'équivalent facilement avec perl.
La façon dont cela fonctionne est d' xargs
invoquer Python avec autant d'arguments qu'il peut tenir sur une seule ligne de commande, et de continuer ainsi jusqu'à épuisement des arguments (fournis par ls -f *.txt
). Le nombre d'arguments pour chaque invocation dépendra de la longueur des noms de fichiers et, euh, d'autres éléments. La fileinput.input
fonction génère des lignes successives à partir des fichiers nommés dans les arguments de chaque invocation, et l' inplace
option lui dit de "capturer" par magie la sortie et de l'utiliser pour remplacer chaque ligne.
Notez que la replace
méthode de chaîne de Python n'utilise pas de regexps; si vous en avez besoin, vous devez les import re
utiliser print re.sub(line, "blah", "blee")
. Ce sont des RegExps compatibles Perl, qui sont en quelque sorte des versions fortement enrichies de celles que vous obtenez sed -r
.
Éditer
Comme le mentionne akira dans les commentaires, la version originale utilisant un glob ( ls -f *.txt
) à la place de la find
commande ne fonctionnerait pas car les globs sont traités par le shell ( bash
) lui-même. Cela signifie qu'avant même l'exécution de la commande, 10 millions de noms de fichiers seront substitués dans la ligne de commande. Il est à peu près garanti de dépasser la taille maximale de la liste d'arguments d'une commande. Vous pouvez utiliser xargs --show-limits
pour des informations spécifiques au système à ce sujet.
La taille maximale de la liste d'arguments est également prise en compte par xargs
, ce qui limite le nombre d'arguments qu'elle passe à chaque appel de python en fonction de cette limite. Comme il xargs
faudra encore invoquer python plusieurs fois, la suggestion d'Akira d'utiliser os.path.walk
pour obtenir la liste des fichiers vous fera probablement gagner du temps.
sed
pour chaque fichier. Je ne sais pas s'il existe un moyen d'ouvrir, de modifier, d'enregistrer et de fermer une série de fichierssed
; si la vitesse est essentielle, vous voudrez peut-être utiliser un programme différent, peut-être perl ou python.