2009-07-30 5 views
23

Когда я использую команду:Использование grep для поиска файлов, предоставляемых поиском: что не так с поиском. | xargs grep '...'?

find . | xargs grep '...' 

Я получаю неправильные матчи. Я пытаюсь найти строку ... во всех файлах в текущей папке.

+3

у вас есть еще примеры? –

+4

, то во-первых, вы должны научиться правильно задавать вопрос. технически, в этом нет ничего плохого. вопрос заключается в том, что вы хотите сделать. Опишите это правильно и ясно – ghostdog74

+0

Вы имеете в виду, что я получаю как ответ? – cupakob

ответ

37

Как сказал Энди Уайт, вы должны использовать fgrep для того, чтобы соответствовать для простого . или избежать точек.

Таким образом, вы должны написать (-type f это только файлы: вы явно не хотите, каталоги.):

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

или если вы все еще хотите использовать Grep:

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

и если вы хотите только текущего каталога, а не его SUBDIRS:

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

'grep -F '...'' должен работать так же хорошо – Hasturkun

+2

@Hasturkun: Да. У меня есть склонность предпочитать разные имена команд, чем дополнительные опции (например, использование 'gunzip' вместо' gzip -d'). Обычно это вопрос вкуса. –

2

Если вы буквально печатаете grep '...', вы будете соответствовать любой строке. Я сомневаюсь, что вы на самом деле набираете '...' для своей команды grep, но если вы, то ... будет соответствовать любым трем символам.

Пожалуйста, разместите больше информации о том, что вы ищете, и, возможно, кто-то может помочь вам больше.

1

Если вы ищете файла, который соответствует, попробуйте:

find . -name "filename pattern" 

или

find . | grep "filename pattern" 

Если вы ищете ищет файлы этого матча (т.е. он содержит grep)

find . | xargs grep "string pattern" 

отлично работает. или просто:

grep "string pattern" -R * 
+0

да, я ищу файлы, содержащие «...» как строку, но: 1. найти. | xargs grep "string pattern" или 2. grep "string pattern" -R * не помогает. – cupakob

7

'.' соответствует любому символу, поэтому вы найдете все строки, содержащие 3 или более символов.

Вы можете избежать точек, как это:

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

Или вы можете использовать fgrep, который делает буквальное совпадение вместо матча регулярного выражения:

find . | xargs fgrep '...' 

(в некоторых версиях Grep также принимают флаг -F, который заставляет их вести себя как fgrep.)

-1

Чтобы завершить ответ Джереми, вы также можете попробовать

find . -type f | xargs grep 'your_pattern' 

или

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

Который похож на xargs

Я мог бы добавить: RTFM! Или в более вежливым способом: использовать & злоупотребление

man command 

!

+1

Более вежливый? Прочитайте дружественное руководство? Как это можно считать невежливым? Вежливый урод. :) –

+0

Человеческие страницы действительно очень дружелюбны и с нетерпением ждут повторного чтения и снова. (Вы сделали мой день, Джереми XD) –

+0

Позже он получает, тем более неприятные мои комментарии, похоже, получат. Кажется, я сейчас нахожусь. Здесь все вниз. –

5

@OP, если вы ищете файлы, которые содержат ...,

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

Безусловно, самое простое решение. grep имеет встроенный рекурсивный поиск файлов. – duckbrain