2010-11-24 7 views
33

Estoy tratando de usar GNU find para encontrar solo los directorios que no contienen otros directorios, pero que pueden contener o no archivos regulares.Usar GNU find para mostrar solo los directorios de hojas

Mi mejor conjetura ha sido hasta ahora:

find dir -type d \(-not -exec ls -dA ';' \) 

pero esto sólo me para crear una larga lista de "".

Gracias!

+0

Al utilizar -exec, la {} argumento se expandió a la trayectoria de la actualidad objeto inspeccionado del sistema de archivos (archivo/directorio/...). Entonces debería haber usado el siguiente comando para imprimir los directorios: find dir -type d \\ (-not -exec ls -dA {} \; \\) –

+1

¡Uy! Olvidé eso. ¡Gracias! –

+1

La misma pregunta en Superusuario: [Usando "buscar" para enumerar solo los directorios que no tienen más hijos] (http://superuser.com/questions/195879/using-find-to-list-only-directories-with-no- más-hijos) – Gilles

Respuesta

59

Puede usar -links si su sistema de archivos es compatible con POSIX (es decir, un directorio tiene un enlace para cada subdirectorio, un enlace de su padre y un enlace a sí mismo, así un recuento de 2 enlaces si no tiene subdirectorios).

El siguiente comando debe hacer lo que quiera:

find dir -type d -links 2 

Sin embargo, no parece funcionar en Mac OS X (como lo mencionan @Piotr). Aquí hay otra versión que es más lento, pero funciona en Mac OS X. Se basa en su versión, con la corrección de manejar los espacios en blanco en los nombres de directorio:

find . -type d -exec sh -c '(ls -p "{}"|grep />/dev/null)||echo "{}"' \; 
+0

Eso funcionó. ¡Gracias! –

+0

@SylvainDefresne, ¿hay alguna idea de si funcionará en el sistema de archivos de NetApp a través de NFS? – Oz123

+0

Acabo de utilizar la primera versión (-links 2) en una NetApp sobre NFS. Entonces la respuesta es sí. –

1

solución @Sylvian no funcionó para mí en mac os x por alguna razón oscura. Así que se me ocurrió una solución un poco más directa. Espero que esto ayude a alguien:

find . -type d -print0 | xargs -0 -IXXX sh -c '(ls -p XXX | grep/>/dev/null) || echo XXX' ; 

Explicación:

  • ls -p termina directorios con '/'
  • por lo (ls -p XXX | grep/>/dev/null) devuelve 0 si no hay ningún directorios
  • -print0 & & -0 es hacer xargs manejan espacios en nombres de directorio
0

¿Qué tal este? Es portátil y no depende de los recuentos de enlaces finnicky. Sin embargo, tenga en cuenta que es importante poner root/foldersin el trailing /.

find root/folder -type d | awk '{ if (length($0)<length(prev) || substr($0,1,length(prev))!=prev) print prev; prev=($0 "/") } END { print prev }' 
0

Aquí es una solución que funciona en Linux y OS X:

find . -type d -execdir bash -c '[ "$(find {} -mindepth 1 -type d)" ] || echo $PWD/{}' \; 

o:

find . -type d -execdir sh -c 'test -z "$(find "{}" -mindepth 1 -type d)" && echo $PWD/{}' \; 
Cuestiones relacionadas