2016-02-02 2 views
2

Я изучаю скрипт bash, и мне приходилось находить файлы, которые не содержат определенную строку, а команда, с которой я пришел, не работает. Я решил проблему тем временем, используя grep -L (stackoverflow.com/questions/1748129/), но я все равно хочу знать, что случилось с моей исходной командой (так что я могу учиться на будущее).что случилось с этой командой bash (find + xarg + grep)?

команда:

find path/ -name *.log -print0 | xargs -0 -i sh -c "if [ '1' == $(cat {} | grep -c 'string that should not occur') ]; then echo {}; fi" 

и ошибка

cat: {}: No such file or directory 

Я также попытался без 'ш -c' раньше, но это не сработало.

редактировать: Я также попытался

find ./path -name *.log -print0 | xargs -0 -i bash -c "if [ '0' == $(cat $0 | grep -c \"ren0 \[RenderJob\] Render time:\") ]; then echo $0; fi" {} 

, которые не работают из-за https://stackoverflow.com/a/1711985/4032670

+0

Запуск подоболочки, а затем интерполирование имени файла в строке, переданной оболочке, полностью отрицает преимущества 'find -print0' и' xargs -0'. Вам нужно что-то вроде 'find ... -print0 | xargs -r0 sh -c 'для f; делать вещи с «$ f»; done '_' то, что произвольные имена файлов передаются правильно. – tripleee

+1

Конечно, ваш сценарий оболочки является ярким примером [бесполезных конструкций] (http://www.iki.fi/era/unix/award.html). 'Cat' бесполезен,' test' бесполезен, 'grep -c' бесполезен ... Вы хотите' grep -q 'string' '$ f "|| echo "$ f" 'простой и простой. Хотя, как указывает @anubhava, 'grep -L' делает это, если у вас есть версия' grep', которая поддерживает эту опцию. – tripleee

+0

благодарит за комментарии, и спасибо за ссылку :) – Adam

ответ

2

Вы можете использовать find и xargs, как это:

find path/ -name '*.log' -print0 | 
xargs -r0 -I {} bash -c 'grep -q "string that should not occur" "{}" || echo "{}"' 

Без bash -c вы можете сделать это с использованием grep -L:

find path/ -name '*.log' -print0 | 
xargs -r0 grep -L "string that should not occur" 
+0

Почему 'find ... | xargs -0 -i sh -c "echo {}" работать? – hek2mgl

+2

Я считаю, что '-L' подразумевает' -q' уже. – tripleee

+1

Использование '{}' в конце командной строки 'xargs' бессмысленно; это то, что он делает в любом случае, в отсутствие какой-либо опции «-I». – tripleee

0

xargs не будет интерполировать {}.

попробовать:

find path/ -name "*.log" | \ 
    while read file; do 
    if grep -q 'string that should not occur' "$file"; then 
     echo $file ; 
    fi ; 
    done 

напечатать все файлы, которые соответствуют.

+0

Это не позволяет справиться с именами файлов с пробелами или метасимволами оболочки в них, с несколькими ошибками, связанными с этим. (Извините, из нисходящего потока на сегодня .../-: – tripleee

Смежные вопросы