¿Cómo entraría en la lista de todos los directorios que no tienen un archivo con un nombre de archivo dado? Por ejemplo, dado este árbol
/
/a
README
file001
file002
/b
README
file001
/c
file003
Quiero enumerar los directorios que no tienen un archivo llamado README, en este caso sería directorio /c. ¿Como podría hacerlo? No puedo pensar en ninguna sintaxis usando eg find.

Respuestas:
Asumiendo una
findimplementación como GNUfindque acepte una{}incrustación en un argumento para-exec:Ejemplo
Aquí los directorios 1/1 a 5/5 tienen un archivo README, los otros directorios están vacíos.
Ahora cuando ejecutamos esta versión de nuestro
findcomando:Referencias
fuente
Puede usar la
-execopción defindverificar el archivo y luego imprimir todos los resultados para los cuales falla la verificación.fuente
No hay necesidad de
find. Solo usa el shell:Si necesita que sea recursivo, puede usar (para
bash,zshpuede hacer esto por defecto, usarset -o globstarenksh93):(tenga en cuenta que los archivos de puntos están excluidos de forma predeterminada).
fuente
Con
zshy calificadores glob (ecadena ):o
agregar
Dpara incluir directorios ocultos:/selecciona solo directorios ye_'[[ ! -f $REPLY/README ]]'_además selecciona solo los nombres de directorio para los que devuelve el código de shell entre las comillastrue, es decir, para cada nombre de directorio ($REPLY) al que se*(/)expande el globo , se ejecuta[[ ! -f $REPLY/README ]]y mantiene el nombre del directorio si el resultado estrue.La segunda forma
^e_'.....'_usa el mismo calificador global, negado (pero esta vez la expresión condicional no se niega:)[[ -f $REPLY/README ]].Lo anterior solo devolverá los nombres de directorio en el directorio actual.
Si desea buscar de forma recursiva (nuevamente, para incluir directorios ocultos, agregue el
Dcalificador):fuente
Portablemente, podrías hacer:
[ -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:O para evitar la condición de carrera, con
zsh:Consulte también ¿Cómo puedo saber si un archivo normal no existe en Bash? en lo.
fuente