Travailler avec xenserver, et je veux exécuter une commande sur chaque fichier qui se trouve dans un répertoire, en récupérant des éléments de la sortie de la commande et en les ajoutant dans un fichier.
Je suis clair sur la commande que je veux utiliser et sur la façon d'extraire les chaînes selon les besoins.
Mais ce que je ne sais pas, c'est comment faire exécuter cette commande sur chaque fichier, en passant au suivant, jusqu'à ce qu'aucun autre fichier ne soit trouvé.
grep $PATTERN *.cpp *.h
. Si vous avez besoin de règles plus spécifiques pour quels fichiers doivent être reçus, utilisez lafind
commande (vérifiez la réponse de Rob).grep -r x .
résultats proviennent de tous les fichiers de toutes les extensions. Si je cours,grep -r x *.scss
je ne reçois aucun résultat.*.scss
fichiers dans le répertoire courant mais quelque part plus profondément dans les sous-répertoires afin que grep ne recherche pas tous les fichiers que vous vouliez. Vous devez utiliser l'--include
option pour dire à grep de rechercher récursivement des fichiers qui correspondent à des modèles spécifiques:grep -r x --include '*.scss' .
(notez les guillemets, ils empêchent le modèle d'être développé par le shell). Ou utilisez simplementfind
(voir la réponse de Rob).Sous Linux, j'utilise normalement cette commande pour grep récursivement pour un texte particulier dans un dir
où,
r = récursif c'est-à-dire, rechercher des sous-répertoires dans le répertoire courant
n = pour imprimer les numéros de ligne sur stdout
i = recherche insensible à la casse
la source
Utilisez find. Sérieusement, c'est le meilleur moyen, car vous pouvez alors vraiment voir sur quels fichiers il fonctionne:
Remarque, le -H est spécifique au mac, il affiche le nom de fichier dans les résultats.
la source
xargs
plutôt que d'utiliser-exec
ceci sera beaucoup plus rapide, car-exec
engendre un nouveau processus pour chaque grep, et la surcharge devient importante avec un grand nombre de fichiers. Les avertissements standard concernant les espaces dans les noms de fichiers s'appliquent àxargs
.xargs
syntaxe.find . -iname "*.sql" -print0 | xargs -0 grep "slow"
Pour rechercher dans tous les sous-répertoires, mais uniquement dans des types de fichiers spécifiques , utilisez grep avec
--include
.Par exemple, rechercher récursivement dans le répertoire courant, du texte dans * .yml et * .yaml:
la source
Si vous souhaitez exécuter plusieurs commandes, vous pouvez utiliser:
la source