Как найти файлы, которые не содержат свое имя файла
При использовании шаблонов для генерации файлов важно включать имя шаблона в шаблон. При чтении сгенерированного файла, он помогает вам найти шаблон, используемый для его создания.
Я хочу найти все шаблоны в каталоге, которые не содержат их собственных имен файлов, распечатать те, которые я нахожу, и завершить работу с ненулевым кодом, если таковые найдены.
Пока что это то, что я придумал.
find . -name "*.xyz" -exec sh -c 'grep -L $(basename {}) {}' \;
Это успешно находит и печатает файлы, но завершается с кодом выхода 0, независимо от того, найдены ли какие-либо файлы. Как я могу найти соответствующие файлы и выйти с ненулевым кодом, если они найдены?
3 ответа
Как я могу найти соответствующие файлы и выйти с ненулевым кодом, если они найдены?
Передайте результат в grep ''
, Инструмент не будет изменять текстовый поток, но он будет генерировать состояние выхода 0
или же 1
в зависимости от того, проходит ли какая-либо линия через него или нет.
Я знаю, что вы хотите это по-другому. На вашем месте я бы приспособился к поведению grep
хоть. Мое обоснование таково: вы хотите знать файлы, которые соответствуют вашим критериям; команда находит их, поэтому ей удается найти хотя бы один файл.
Однако, если вы настаиваете на противоположном поведении, просто отмените статус выхода. Пример:
! find . -name "*.xyz" -exec sh -c 'grep -L "$(basename "$1")" "$1"' sh {} \; | grep ''
Обратите внимание, я отладил ваш sh
вызов внутри find
, Ваш оригинальный подход будет иметь неприятные последствия, если {}
расширен до ./a;rm -rf ~;.xyz
(это допустимое имя файла во многих файловых системах Linux).
for f in *.xyz; do
grep -q $f $f || echo "$f does not contain itself"
done
Он выдаст вам список файлов, которые вы ищете, хотя он по-прежнему возвращает ноль (потому что эхо успешно).
Может быть что-то вроде grep .... && <do if found> || <do if not found>
делает работу