dada la siguiente estructura:
oz123@debian:~/ $ tree .
.
├── a
│ ├── a1
│ ├── a2
│ └── a3
├── a1
│ ├── a11
│ ├── a12
│ └── a31
├── b
│ └── b1
│ ├── b11
│ │ └── b21
│ │ └── b31
│ ├── b12
│ └── b3
└── c
16 directories, 0 files
¿Cómo encuentro todos los nodos finales?
Encontré las siguientes soluciones que parecen ser buenas, pero tengo que demostrar que no hay un caso de prueba que falle.
La página de ayuda de los -links
estados:
También puede buscar archivos que tengan un cierto número de enlaces, con 'enlaces'. Los directorios normalmente tienen al menos dos enlaces duros; su . La entrada es la segunda. Si tienen subdirectorios, cada uno de ellos también tiene un enlace rígido llamado .. a su directorio padre. Los . y .. las entradas de directorio normalmente no se buscan a menos que se mencionen en la línea de comando de búsqueda.
solución posible:
oz123@debian:~/ $ find . -type d -links 2
./a/a2
./a/a3
./a/a1
./c
./a1/a31
./a1/a11
./a1/a12
./b/b1/b12
./b/b1/b3
./b/b1/b11/b21/b31
- ¿Alguien puede proporcionar una mejor solución (sin usar tuberías y sed, esto ha sido eficaz ...)
- ¿Funcionará en cualquier sistema de archivos?
command-line
find
file-search
Oz123
fuente
fuente
-links 2
truco. No funcionarábtrfs
.Respuestas:
Como una adición a su propia solución
-links
, solo quiero agregar que no funcionará en sistemas de archivos que no sigan la convención de enlace de directorio de Unix. Desde laman find
opción,-noleaf
estos son al menos CD-ROM, sistemas de archivos MS-DOS y puntos de montaje de volumen AFS.Como referencia, esta pregunta ya se discutió con diferentes soluciones que de hecho son más lentas y generalmente recurren a tuberías a sed / awk y similares.
fuente
Hay una opción un poco más obvia
-empty
:upd Ok, tienes razón de esta manera no funcionará con archivos en directorios.
Así que aquí está una versión no confiable del sistema de archivos fijo:
fuente
find . -type d -links 2
funciona en la mayoría de los sistemas de archivos, pero no en todos. No creo que haya una manera de saber más que saber qué tipos de sistemas de archivos tienen la propiedad de que los directorios contienen un enlace a ellos mismos. GNU find detecta esto dinámicamente (si imprime algo sobre "Activar automáticamente la opción find -noleaf", sabrá que su sistema de archivos no tiene esta propiedad). Los tipos de sistema de archivos más comunes están bien, pero no FAT o btrfs.Si quiere estar seguro, deberá probar cada directorio. Una forma de hacerlo es invocar
find
nuevamente para cada subdirectorio.(con GNU
find
, se puede reemplazar-prune
con-print -quit
para que sea un poco más eficiente).Otra forma es postprocesar la salida de
find
. Confind -depth
, un directorio hoja es uno que no sigue un subdirectorio de sí mismo.fuente
Pruebe la siguiente solución (debe ser compatible con Linux, Unix y OS X):
Es un enfoque similar a la solución rápida , pero sin tuberías.
fuente