2009-07-30 7 views
23

Lorsque j'utilise la commande:Utiliser grep pour rechercher les fichiers fournis par find: ce qui ne va pas avec find. | xargs grep '...'?

find . | xargs grep '...' 

je reçois les mauvais matchs. J'essaye de rechercher la chaîne ... dans tous les dossiers dans le dossier courant.

+3

avez-vous d'autres exemples? –

+4

puis d'abord, vous devez apprendre à poser la question correctement. techniquement, il n'y a rien de mal à cela. la question est ce que vous voulez faire. décrivez-le correctement et clairement – ghostdog74

+0

voulez-vous dire, ce que je reçois comme réponse? – cupakob

Répondre

37

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

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

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

ou si vous voulez continuer à utiliser grep:

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

et si vous ne souhaitez que le répertoire courant et non ses subdirs:

find . -maxdepth 1 -type f | xargs fgrep '...' 
+2

'grep -F '...' 'devrait fonctionner aussi bien – Hasturkun

+2

@Hasturkun: Oui. J'ai juste tendance à préférer des noms de commandes différents à des options supplémentaires (comme utiliser 'gunzip' au lieu de' gzip -d'). Juste une question de goût habituellement. –

2

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

S'il vous plaît poster plus d'informations sur ce que vous cherchez, et peut-être que quelqu'un peut vous aider plus.

1

Si vous êtes à la recherche d'un nom de fichier qui correspond, essayez:

find . -name "filename pattern" 

ou

find . | grep "filename pattern" 

Si vous cherchez la recherche de fichiers ce match (il contient la chaîne de grep)

find . | xargs grep "string pattern" 

fonctionne très bien. ou tout simplement:

grep "string pattern" -R * 
+0

oui, je cherche des fichiers qui contiennent "..." comme une chaîne, mais: 1. trouver. | xargs grep "modèle de chaîne" ou 2. grep "modèle de chaîne" -R * n'a pas aidé. – cupakob

7

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

Vous pouvez échapper aux points, comme celui-ci:

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

Ou vous pouvez utiliser fgrep, qui fait un match littéral au lieu d'un match de regex:

find . | xargs fgrep '...' 

(Certaines versions de grep accepte également un drapeau -F qui le fait se comporter comme fgrep.)

-1

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

find . -type f | xargs grep 'your_pattern' 

ou

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

est similaire à un xargs

je pourrais ajouter: RTFM! Ou d'une manière plus polie: utiliser la violence & de

man command 

!

+1

Plus poli? Lire le manuel amical? Comment cela pourrait-il être considéré comme impoli? Poli monstre. :) –

+0

Les pages man sont en effet très sympathiques et ont hâte d'être relues. (Vous avez fait ma journée, Jeremy XD) –

+0

Plus il est tard, plus mes commentaires semblent désagréables. Je pense que je pique maintenant. C'est tout en descente d'ici. –

5

@OP, si vous êtes à la recherche des fichiers qui contiennent ...,

grep -R "\.\.\." * 
+1

De loin la solution la plus simple. grep a la recherche de fichier récursif intégrée. – duckbrain

Questions connexes