Портативно, ви можете:
find . -type d -exec sh -c '
for dir do
[ -f "$dir/README" ] || printf "%s\n" "$dir"
done' sh '{}' +
[ -f file ]перевіряє, чи існує файл і чи підтверджено це звичайний файл (після роздільної здатності символьної посилання).
Якщо ви хочете перевірити, що він існує лише (як запис у цьому каталозі), незалежно від його типу, вам знадобиться: [ -e file ] || [ -L file ]хоч зауважте, що для виконання цих тестів вам потрібен дозвіл пошуку в каталозі. Ви можете додати кілька [ -x "$dir" ]тестів для обліку таких випадків, як:
find . -type d -exec sh -c '
for dir do
if [ -x "$dir" ]; then
[ -f "$dir/README" ] || printf "%s\n" "$dir"
else
printf >&2 "Cannot tell for \"%s\"\n" "$dir"
fi
done' sh '{}' +
Або щоб уникнути умови гонки, використовуючи zsh:
find . -type d -exec zsh -c '
zmodload zsh/system
for dir do
ERRNO=0
if [ ! -f "$dir/README" ]; then
if [ "$errnos[ERRNO]" = ENOENT ]; then
printf "%s\n" "$dir"
else
syserror -p "ERROR: $dir/README: "
fi
fi
done' zsh '{}' +
Дивіться також Як дізнатися, чи не існує звичайного файлу в Bash? на ТАК.