Использование grep для поиска файлов, предоставляемых find: что не так с find. | xargs grep '...'? - PullRequest
24 голосов
/ 30 июля 2009

Когда я использую команду:

find . | xargs grep '...'

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

Ответы [ 6 ]

38 голосов
/ 30 июля 2009

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

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

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

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

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

И если вам нужен только каталог current , а не его подкаталоги:

find . -maxdepth 1 -type f | xargs fgrep '...'
7 голосов
/ 30 июля 2009

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

Вы можете выбраться из точек, например:

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

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

find . | xargs fgrep '...'

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

5 голосов
/ 30 июля 2009

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

grep -R "\.\.\." *
2 голосов
/ 30 июля 2009

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

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

1 голос
/ 30 июля 2009

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

find . -name "filename pattern" 

или

find . | grep "filename pattern"

Если вы ищете файлов , которые соответствуют (то есть содержит строку grep)

find . | xargs grep "string pattern"

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

grep "string pattern" -R *
0 голосов
/ 30 июля 2009

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

find . -type f | xargs grep 'your_pattern'

или

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

Что похоже на xargs

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

man command

!

...