2009-09-01 8 views

Répondre

12

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).

+0

Il vous manque '\ +' ou '\;' à la fin de votre première commande. – spatz

+0

Est-ce que cette tentative de trouver le nom de fichier dans mystring? Je pense qu'il cherche l'inverse. – Kevin

+0

@spatz: merci pour la remarque, j'ai corrigé l'exemple. –

2

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

+0

Je suggère également enfermer le motif suivant - nommez entre guillemets pour éviter que la coquille ne fasse un motif correspondant –

+0

Je tiens à vous remercier de fournir des réponses aussi complètes. – Tolga

1
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 
1

Vous pouvez utiliser

find . -iname *.txt -exec egrep mystring \{\} \; 
1

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' {} \; 
1

il y a un option de récursivité de egrep vous pouvez utiliser

egrep -R "pattern" *.log 
+0

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. –

+0

Peut-être avec 'egrep -R" pattern "--include = *. Log .'? – moala

1

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 \; 
Questions connexes