web-dev-qa-db-fra.com

Trouver une sous-chaîne dans des fichiers à travers les sous-répertoires avec une seule commande intégrée?

Dans Windows, si je voulais trouver une chaîne sur tous les fichiers de tous les sous-répertoires, je ferais quelque chose comme

findstr /C:"the string" /S *.h

Cependant, à Linux (disons, Ubuntu), je n'ai trouvé aucun autre moyen que de la commande de canalisée impliquant find, xargs, grep (un exemple est à cette page: - Comment puis-je récursivement grep via des sous-répertoires? ). Cependant, ma question est différente: y a-t-il une commande unique qui fonctionne à travers cette magie, sans avoir à écrire mon script shell?

10
Guido Domenici

GNU Grep permet de rechercher récursivement via des sous-répertoires:

grep -r --include='*.h' 'the string' .
19
wag

grep -r searchpattern /path/to/start/in

/path/to/start/in/ peut être juste ". "Pour le répertoire actuel.

2
mattdm

Non. find -name \*.h -print0 | xargs -0 grep -l 'the regex' est aussi magique que possible.

1
glenn jackman

y a-t-il un fichier une commande unique intégrée qui travaille à travers cette magie ...?

Pour être pédants, Non, vous ne pouvez pas supposer qu'une telle commande existe .

Il existe de nombreuses implémentations différentes d'UNIX et chacune a ses différentes bizarreries. POSIX, le dénominateur commun (et la chose la plus proche à une norme entre les unes) ne spécifie pas une telle option pour grep .

Comme indiqué dans d'autres réponses, la mise en œuvre de GNU de grep a une option non standard qui fait ce que vous voulez. Bien que cette implémentation particulière soit courante sur les systèmes Linux, vous ne pouvez pas assumer sa disponibilité sur des systèmes UNIX, même certains systèmes Linux.

Enfin, je devrais mentionner que c'est la philosophie UNIX Pour favoriser la combinaison de plusieurs programmes primitifs, sur l'utilisation d'un grand exécutable monolithique tente de tout faire à la fois.

Dans votre cas, ramper le système de fichiers et la correspondance de REGEXP dans un flux sont deux tâches distinctes. Il n'est que normal de traiter chacun dans un programme séparé.

0
rahmu