Я изучаю скрипт 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
Запуск подоболочки, а затем интерполирование имени файла в строке, переданной оболочке, полностью отрицает преимущества 'find -print0' и' xargs -0'. Вам нужно что-то вроде 'find ... -print0 | xargs -r0 sh -c 'для f; делать вещи с «$ f»; done '_' то, что произвольные имена файлов передаются правильно. – tripleee
Конечно, ваш сценарий оболочки является ярким примером [бесполезных конструкций] (http://www.iki.fi/era/unix/award.html). 'Cat' бесполезен,' test' бесполезен, 'grep -c' бесполезен ... Вы хотите' grep -q 'string' '$ f "|| echo "$ f" 'простой и простой. Хотя, как указывает @anubhava, 'grep -L' делает это, если у вас есть версия' grep', которая поддерживает эту опцию. – tripleee
благодарит за комментарии, и спасибо за ссылку :) – Adam