Использование grep для поиска файлов, предоставленных find:что не так с find .| xargs grep '...'?
Вопрос
Когда я использую команду:
find . | xargs grep '...'
Я получаю неправильные совпадения.Я пытаюсь найти строку ...
во всех файлах текущей папки.
Решение
Как сказал Энди Уайт, вы должны использовать fgrep
, чтобы соответствовать простому .
, или избегать точек.
Итак, вы должны написать ( -type f
должен иметь только файлы: вам явно не нужны каталоги.):
find . -type f | xargs fgrep '...'
или если вы все еще хотите использовать grep:
find . -type f | xargs grep '\.\.\.'
И если вам нужен только каталог текущий , а не его подкаталоги:
find . -maxdepth 1 -type f | xargs fgrep '...'
Другие советы
'.' соответствует любому символу, поэтому вы найдете все строки, содержащие 3 или более символов.
Вы можете либо избежать точек, вот так:
find . | xargs grep '\.\.\.'
Или вы можете использовать fgrep, который выполняет буквальное совпадение вместо совпадения регулярных выражений:
find . | xargs fgrep '...'
(Некоторые версии grep также принимают флаг -F, что заставляет их вести себя как fgrep.)
@OP, если вы ищете файлы, которые содержат ...,
grep -R "\.\.\." *
Если вы буквально набираете grep '...'
, вы будете сопоставлять практически любую строку. Я сомневаюсь, что вы на самом деле набираете '...'
для своей команды grep, но если это так, ...
будет соответствовать любым трем символам.
Пожалуйста, опубликуйте больше информации о том, что вы ищете, и, возможно, кто-то может вам помочь.
Если вы ищете имя файла это соответствует, попробуйте:
find . -name "filename pattern"
или
find . | grep "filename pattern"
Если вы ищете, ищете Файлы это совпадение (т.е. оно содержит строку grep)
find . | xargs grep "string pattern"
работает нормально.или просто:
grep "string pattern" -R *
Чтобы дополнить ответ Джереми, вы также можете попробовать
find . -type f | xargs grep 'your_pattern'
или
find . -type f -exec grep 'your_pattern' {} +
Который похож на xargs
Я мог бы добавить :RTFM !Или в более вежливой форме :использование и злоупотребление
man command
!