web-dev-qa-db-fra.com

Utiliser grep pour rechercher des fichiers fournis par find: ce qui ne va pas avec find. | xargs grep '...'?

Lorsque j'utilise la commande:

find . | xargs grep '...'

J'ai les mauvais matchs. J'essaie de rechercher la chaîne ... dans tous les fichiers du dossier actuel.

25
cupakob

Comme l'a dit Andy White, vous devez utiliser fgrep afin de correspondre à plain ., ou échappez aux points.

Vous devez donc écrire (-type f est d'avoir uniquement les fichiers: vous ne voulez évidemment pas les répertoires.):

find . -type f | xargs fgrep '...'

ou si vous souhaitez toujours utiliser grep:

find . -type f | xargs grep '\.\.\.'

Et si vous ne voulez que le répertoire current et non ses sous-répertoires:

find . -maxdepth 1 -type f | xargs fgrep '...'
38
Steve Schnepp

"." correspond à n'importe quel caractère, vous trouverez donc toutes les lignes contenant 3 caractères ou plus.

Vous pouvez soit échapper aux points, comme ceci:

find . | xargs grep '\.\.\.'

Ou vous pouvez utiliser fgrep, qui fait une correspondance littérale au lieu d'une correspondance regex:

find . | xargs fgrep '...'

(Certaines versions de grep acceptent également un indicateur -F qui les fait se comporter comme fgrep.)

7
Laurence Gonsalves

@OP, si vous recherchez des fichiers contenant ...,

grep -R "\.\.\." *
5
ghostdog74

Si vous tapez littéralement grep '...' vous correspondrez à peu près à n'importe quelle chaîne. Je doute que vous tapiez actuellement '...' pour votre commande grep, mais si vous l'êtes, le ... correspondra à trois caractères quelconques.

Veuillez publier plus d'informations sur ce que vous recherchez, et peut-être que quelqu'un pourra vous aider davantage.

2
Andy White

Si vous recherchez un nom de fichier correspondant, essayez:

find . -name "filename pattern" 

ou

find . | grep "filename pattern"

Si vous cherchez à chercher fichiers qui correspondent (c'est-à-dire qu'il contient la chaîne grep)

find . | xargs grep "string pattern"

fonctionne bien. ou simplement:

grep "string pattern" -R *
1
Jeremy Powell

Pour compléter la réponse de Jeremy, vous pouvez également essayer

find . -type f | xargs grep 'your_pattern'

ou

find . -type f -exec grep 'your_pattern' {} +

Qui est similaire à un xargs

Je pourrais ajouter: RTFM! Ou d'une manière plus polie: utilisation et abus de

man command

!

0
Isaac Clarke