Portablemente, podrías hacer:
find . -type d -exec sh -c '
for dir do
[ -f "$dir/README" ] || printf "%s\n" "$dir"
done' sh '{}' +
[ -f file ]
prueba si el archivo existe y se confirma que es un archivo normal (después de la resolución del enlace simbólico).
Si desea probar que solo existe (como una entrada en ese directorio), independientemente de su tipo, necesitaría: [ -e file ] || [ -L file ]
aunque tenga en cuenta que necesita permiso de búsqueda en el directorio para realizar esas pruebas. Es posible que desee agregar algunas [ -x "$dir" ]
pruebas para tener en cuenta esos casos como:
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 '{}' +
O para evitar la condición de carrera, con 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 '{}' +
Consulte también ¿Cómo puedo saber si un archivo normal no existe en Bash? en lo.