Sous Windows, si je voulais trouver une chaîne dans tous les fichiers de tous les sous-répertoires, je ferais quelque chose comme
findstr /C:"the string" /S *.h
Cependant, sous Linux ( par exemple, Ubuntu) Je n'ai pas trouvé d' autre moyen que certaines commandes impliquant canalisé find
, xargs
et grep
(un exemple est à cette page: Comment puis - je récursive grep à travers les sous-répertoires ). Cependant, ma question est différente: existe-t-il une seule commande intégrée qui fonctionne à travers cette magie, sans avoir à écrire mon script shell?
*
par'*'
: "La citation du dernier caractère générique est nécessaire pour éviter les erreurs lorsqu'un nom de fichier commence par -"-Msomething
ou à unGREP_OPTIONS
paramètre.grep -r searchpattern /path/to/start/in
Où
/path/to/start/in/
peut être juste ".
" pour le répertoire courant.la source
Non,
find -name \*.h -print0 | xargs -0 grep -l 'the regex'
c'est aussi magique que possible.la source
-r
option. Pas besoin d'artillerie lourde.xargs
ajoute juste du bruit. Utilisationfind -name \*.h -execdir grep -l 'the regex {} +
Pour être pédant, 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 particularités. POSIX, le dénominateur commun (et la chose la plus proche d'une norme dans Unices) ne spécifie pas une telle option pour
grep
.Comme mentionné dans d'autres réponses, l'implémentation de GNU
grep
a une option non standard qui fait ce que vous voulez. Bien que cette implémentation particulière puisse être courante sur les systèmes Linux, vous ne pouvez pas supposer sa disponibilité sur un système Unix, même sur certains systèmes Linux.Enfin, je dois mentionner que c'est la philosophie Unix de favoriser la combinaison de plusieurs programmes primitifs, plutôt que l'utilisation d'un seul gros exécutable monolithique essayant de tout faire à la fois.
Dans votre cas, l'analyse du système de fichiers et l'expression rationnelle correspondante dans un flux sont deux tâches distinctes. Il est normal de traiter chacun dans un programme distinct.
la source
Pour rechercher une chaîne dans un répertoire donné, utilisez la commande ci-dessous
Par exemple:
la source
grep
peut prendre plus d'un fichier en argument, vous devez donc utiliser+
au lieu de\;
pour éviter d'exécuter ungrep
appel par fichier, ce qui est assez inefficace.-name '*'
limite aux fichiers dont le nom est du texte valide dans les paramètres régionaux actuels (dans certainesfind
implémentations au moins), mais les autres composants du répertoire peuvent toujours contenir des séquences d'octets qui ne forment pas de caractères valides. Si votre intention-name '*'
était de vous assurer que la sortie est du texte valide (en omettant les fichiers avec des noms incorrects), vous préférez utiliserfind ... ! -name '*' -prune -o -exec grep ... {} +
, ce qui empêcherait égalementfind
de descendre dans des répertoires avec des noms incorrects.