Как найти файлы, которые не содержат собственного имени файла

314
Craig

При использовании шаблонов для генерации файлов важно включать имя шаблона в шаблон. При чтении сгенерированного файла, он помогает вам найти шаблон, используемый для его создания.

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

Пока это то, что я придумал.

find . -name "*.xyz" -exec sh -c 'grep -L $(basename {}) {}' \; 

Это успешно находит и печатает файлы, но завершается с кодом выхода 0 независимо от того, найдены ли какие-либо файлы. Как я могу найти соответствующие файлы и выйти с ненулевым кодом, если они найдены?

1

3 ответа на вопрос

1
Kamil Maciorowski

Как я могу найти соответствующие файлы и выйти с ненулевым кодом, если они найдены?

Передайте результат в grep ''. Инструмент не будет изменять текстовый поток, но он будет генерировать состояние выхода 0или в 1зависимости от того, проходит ли через него какая-либо строка или нет.

Я знаю, ты хочешь это по-другому. Если бы я был тобой, я бы приспособился к поведению, grepхотя. Мое обоснование таково: вы хотите знать файлы, которые соответствуют вашим критериям; команда находит их, поэтому ей удается найти хотя бы один файл.

Однако, если вы настаиваете на противоположном поведении, просто отмените статус выхода . Пример:

! find . -name "*.xyz" -exec sh -c 'grep -L "$(basename "$1")" "$1"' sh {} \; | grep '' 

Заметьте, я отладил ваш shвызов внутри find. Ваш оригинальный подход имел бы обратный эффект, если его {}расширить до ./a;rm -rf ~;.xyz(это допустимое имя файла во многих файловых системах Linux).

0
rpax

Может быть, что-то вроде grep .... && <do if found> || <do if not found>делает работу

0
mpez0
for f in *.xyz; do grep -q $f $f || echo "$f does not contain itself" done 

Он выдаст вам список файлов, которые вы ищете, хотя он по-прежнему возвращает ноль (потому что эхо успешно).