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

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

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

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

На данный момент у меня получилось вот что.

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

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

решение1

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

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

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

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

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

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

решение2

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

решение3

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

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

Связанный контент