Найти и grep, чтобы вернуть файлы без строки - PullRequest
0 голосов
/ 17 января 2019

У меня есть следующая команда find, sed и grep.

 find . -type d \( -name ThirdParty -o -name 3rdParty -o -name 3rd_party \) -prune -o -type f \( -name "*.bat" \) -exec grep -L 'FOO' {} \; -print0 | xargs -0 sed -i -e '1iFOO'

Я хочу иметь возможность найти все .bat файлы в каталоге, которые НЕ содержат строку «FOO», и передать их команде sed, которая добавляет строку «FOO» в начало файла. Однако, когда я запускаю часть моей команды find и grep (без sed):

 find . -type d \( -name ThirdParty -o -name 3rdParty -o -name 3rd_party \) -prune -o -type f \( -name "*.bat" \) -exec grep -L 'FOO' {} \; -print

возвращает ВСЕ файлы bat, даже те, которые содержат строку 'FOO'. Это приводит меня к мысли, что команда grep ошибочна. Как я могу это исправить? спасибо

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Изменение:

grep -L 'FOO'

до:

awk '/FOO/{exit 1}'

, поэтому вы можете напечатать имя файла только в том случае, если FOO отсутствует в файле.

Чтобы было ясно, вся командная строка тогда будет:

find . -type d \( -name ThirdParty -o -name 3rdParty -o -name 3rd_party \) \
    -prune -o -type f \( -name "*.bat" \) \
    -exec awk '/FOO/{exit 1}' {} \; -print0 |
        xargs -0 sed -i -e '1iFOO'
0 голосов
/ 17 января 2019

grep печатает имена файлов, которые не совпадают (с символами новой строки, а не с нулями в качестве терминатора). Вам нужно подавить вывод grep. Может быть:

find . -type d \( -name ThirdParty -o -name 3rdParty -o -name 3rd_party \) \
    -prune -o -type f \( -name "*.bat" \) \
    -exec sh -c '! grep -q "FOO" $1' _ {} \; -print0 

Но, кажется, немного чище написать:

find . -type d \( -name ThirdParty -o -name 3rdParty -o -name 3rd_party \) \
        -prune -o -type f \( -name "*.bat" \) \
        -not -exec grep -q "FOO" {} \; -print0
0 голосов
/ 17 января 2019

Аргумент -exec для find указывает тест: если он возвращает 0, результат включается; если он возвращает ненулевое значение, результат исключается. grep -L возвращает 0 независимо от того, находит ли он результаты, поэтому он эквивалентен -exec true \; (или не передает -exec вообще).

Вы можете достичь желаемого результата, передав выходные данные из команды find в grep через xargs: find $find_args | xargs grep -L FOO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...