bash - help - linux find mtime
Use GNU find para mostrar solo los directorios de hojas (5)
Intento utilizar GNU find para encontrar solo los directorios que no contienen otros directorios, pero que pueden contener o no archivos regulares.
Mi mejor estimación hasta ahora ha sido:
find dir -type d /( -not -exec ls -dA '';'' /)
pero esto solo me da una larga lista de "."
¡Gracias!
¿Qué hay de este? Es portátil y no depende de los recuentos de enlaces finnicky. Sin embargo, tenga en cuenta que es importante poner la root/folder
sin el final /.
find root/folder -type d | awk ''{ if (length($0)<length(prev) || substr($0,1,length(prev))!=prev) print prev; prev=($0 "/") } END { print prev }''
Acabo de encontrar otra solución para esto que funciona tanto en Linux como en macOS (sin find -exec
)!
Implica sort
(dos veces) y awk
:
find dir -type d | sort -r | awk ''a!~"^"$0{a=$0;print}'' | sort
Explicación:
ordenar la salida de
find
en orden inverso- ahora tienes subdirectorios que aparecen primero, luego sus padres
use
awk
para omitir líneas si la línea actual es un prefijo de la línea anterior- (este comando es de la respuesta aquí )
- ahora eliminaste "todos los directorios principales" (te quedan los directorios principales)
-
sort
(por lo que se parece a la salida defind
normal) - Voila! Rápido y portátil.
Aquí hay 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/{}'' /;
La 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 ''/'' - entonces
(ls -p XXX | grep / >/dev/null)
devuelve 0 si no hay directorios -
-print0
&&-0
es para hacer que xargs maneje espacios en nombres de directorio
Puede usar -links si su sistema de archivos es compatible con POSIX (es decir, un directorio tiene un enlace para cada subdirectorio en él, un enlace de su padre y un enlace a sí mismo, por lo tanto un recuento de 2 enlaces si no tiene subdirectorios).
El siguiente comando debería hacer lo que quieras:
find dir -type d -links 2
Sin embargo, parece que no funciona en Mac OS X (como se menciona en @Piotr). Aquí hay otra versión que es más lenta, pero funciona en Mac OS X. Se basa en su versión, con corrección para manejar espacios en blanco en nombres de directorio:
find . -type d -exec sh -c ''(ls -p "{}"|grep />/dev/null)||echo "{}"'' /;