xargs grep игнорирует файлы, которые не соответствуют запросу - PullRequest
3 голосов
/ 18 апреля 2011

Быстрый вопрос относительно создания grep с xargs. Когда я это сделаю, я буду отображаться с кучей результатов из файлов, которые не существуют, с добавлением файлов, которые успешно соответствуют критериям поиска, таких как:

find . | xargs grep 'Cache'

grep: PT: No such file or directory
grep: Sans: No such file or directory
grep: Free: No such file or directory
grep: Font: No such file or directory
grep: License.txt: No such file or directory

Может ли быть передан аргумент, который будет отображать только попадания?

Спасибо.

Ответы [ 4 ]

7 голосов
/ 18 апреля 2011

Имена файлов содержат пробелы, поэтому необходимо указать find, чтобы выводить результаты, разделенные байтами NUL, а не переводом строки - вместо этого попробуйте следующее:

find . -print0 | xargs -0 egrep 'Cache'

От -0 до xargsговорит, что интерпретировать данные из STDIN как разделенные байтами NUL.(Одиночные кавычки вокруг Cache здесь не нужны.)

Многие инструменты в Unix-подобных системах также имеют возможность создавать или использовать данные, разделенные NUL-байтами, поскольку 0x00 и 0x2F (forwardкосая черта) - это единственные два байта, которые не разрешены в именах файлов или каталогов - это распространенный способ безопасного обращения с именами файлов с пробелами или переводами строки.

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

xargs -0 egrep Cache /dev/null

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

1 голос
/ 18 апреля 2011
find . | xargs grep 'Cache' 2>/dev/null
1 голос
/ 18 апреля 2011

Если у вас есть GNU grep, просто сделайте его рекурсивным

grep -R "Cache" *
0 голосов
/ 18 апреля 2011

При использовании find с xargs вы всегда должны использовать -print0, поскольку проблема с разделителем http://en.wikipedia.org/wiki/Xargs#The_separator_problem. Однако, если у вас есть список файлов, каждый из которых находится в строке, вы можете взглянуть на GNU Parallel:

find . | parallel grep Cache

Посмотрите вступительное видео, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

...