Je voudrais trouver les fichiers contenant une chaîne spécifique sous linux. J'ai essayé quelque chose comme mais je ne pouvais pas réussir:comment trouver les fichiers contenant une chaîne en utilisant egrep
trouver. -name * .txt | egrep mystring
Je voudrais trouver les fichiers contenant une chaîne spécifique sous linux. J'ai essayé quelque chose comme mais je ne pouvais pas réussir:comment trouver les fichiers contenant une chaîne en utilisant egrep
trouver. -name * .txt | egrep mystring
Ici, vous envoyez les noms de fichiers (sortie du find command
) en tant qu'entrée à egrep; vous voulez réellement lancer egrep sur le contenu des fichiers.
Voici quelques alternatives:
find . -name "*.txt" -exec egrep mystring {} \;
ou mieux encore
find . -name "*.txt" -print0 | xargs -0 egrep mystring
Cochez la find command help pour vérifier ce que les arguments simples font.
La première approche générera un nouveau processus pour chaque fichier, tandis que la seconde passera plus d'un fichier comme argument à egrep; les drapeaux -print0 et -0 sont nécessaires pour traiter les noms de fichiers potentiellement désagréables (ce qui permet de séparer correctement les noms de fichiers même si un nom de fichier contient un espace, par exemple).
essayer:
find . -name '*.txt' | xargs egrep mystring
Il y a deux problèmes avec votre version:
Tout d'abord, *.txt
sera d'abord étendu par le shell, vous donnant une liste des fichiers dans le répertoire courant qui se terminent par .txt
, par exemple, si vous disposez des éléments suivants:
[[email protected]:~]$ ls *.txt
test.txt
[[email protected]:~]$
votre commande find
deviendra find . -name test.txt
. Juste essayez ce qui suit pour illustrer:
[[email protected]:~]$ echo find . -name *.txt
find . -name test.txt
[[email protected]:~]$
En second lieu, egrep
ne prend pas de noms de fichiers STDIN
. Pour les convertir en arguments, vous devez utiliser xargs
Je suggère également enfermer le motif suivant - nommez entre guillemets pour éviter que la coquille ne fasse un motif correspondant –
Je tiens à vous remercier de fournir des réponses aussi complètes. – Tolga
find . -name *.txt | egrep mystring
Cela ne fonctionnera pas comme egrep
seront à la recherche pour mystring
dans le résultat généré par find . -name *.txt
qui ne sont que le chemin d'accès *.txt
fichiers.
Au lieu de cela, vous pouvez utiliser xargs
:
find . -name *.txt | xargs egrep mystring
Vous pouvez utiliser
find . -iname *.txt -exec egrep mystring \{\} \;
Voici un exemple qui renverra les chemins de fichiers d'un ensemble *.log
fichiers qui ont une ligne qui commence par ERROR
:
find . -name "*.log" -exec egrep -l '^ERROR' {} \;
il y a un option de récursivité de egrep vous pouvez utiliser
egrep -R "pattern" *.log
Cela ne fonctionne pas. L'option -R ne récursive que dans les répertoires s'ils sont fournis dans la liste des arguments. Dans ce cas, tous les fichiers de ces répertoires seront lus non seulement les fichiers se terminant par .log. Si vous avez du succès avec cette méthode, c'est parce qu'il y a des fichiers se terminant par .log dans le répertoire courant, car alors le shell analyse le fichier * .log. –
Peut-être avec 'egrep -R" pattern "--include = *. Log .'? – moala
Si vous ne souhaitez que les noms de fichiers:
find . -type f -name '*.txt' -exec egrep -l pattern {} \;
Si vous voulez des noms de fichiers et les matches:
find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \;
Il vous manque '\ +' ou '\;' à la fin de votre première commande. – spatz
Est-ce que cette tentative de trouver le nom de fichier dans mystring? Je pense qu'il cherche l'inverse. – Kevin
@spatz: merci pour la remarque, j'ai corrigé l'exemple. –