Портативно, вы могли бы сделать:
find . -type d -exec sh -c '
for dir do
[ -f "$dir/README" ] || printf "%s\n" "$dir"
done' sh '{}' +
[ -f file ]тесты , если файл существует и подтверждается как обычный файл (после SYMLINK разрешения).
Если вы хотите проверить, что он существует только (как запись в этом каталоге), независимо от его типа, вам понадобится:, [ -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? на ТАК.