¿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
find
implementación como GNUfind
que 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
find
comando:Referencias
fuente
Puede usar la
-exec
opción defind
verificar 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
,zsh
puede hacer esto por defecto, usarset -o globstar
enksh93
):(tenga en cuenta que los archivos de puntos están excluidos de forma predeterminada).
fuente
Con
zsh
y calificadores glob (e
cadena ):o
agregar
D
para 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
D
calificador):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