¿Cómo limitar la profundidad para la lista de archivos recursiva?

346

¿Hay alguna manera de limitar la profundidad de una lista recursiva de archivos en Linux?

El comando que estoy usando en este momento es:

ls -laR > dirlist.txt

Pero tengo alrededor de 200 directorios y cada uno de ellos tiene 10 de directorios. Por lo tanto, llevará demasiado tiempo y acaparará demasiados recursos del sistema.

Todo lo que realmente me interesa es la información de propiedad y permisos para los subdirectorios de primer nivel:

drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/htdocs  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/htdocs  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/htdocs  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/htdocs
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/cgi-bin

EDITAR:

Elección final de comando:

find -maxdepth 2 -type d -ls >dirlist
Jon
fuente
3
¿Podrías también algo así ls -la /var/www/vhosts/*?
KevinO

Respuestas:

494

Echa un vistazo a la -maxdepthbandera defind

find . -maxdepth 1 -type d -exec ls -ld "{}" \;

Aquí utilicé 1 como profundidad de nivel máxima, -type dsignifica buscar solo directorios, que luego ls -ldenumera los contenidos de, en formato largo.

Alberto Zaccagni
fuente
2
Dado que el OP desea conocer los permisos de los directorios, debe agregar la -dopción a ls.
Peter van der Heijden
@Peter van der Heijden: acabo de escribir la findparte para resolver su problema principal. De todos modos, gracias, lo estoy agregando.
Alberto Zaccagni
3
Yo uso -print0y xargs -0mucho. Ejemplo:find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
Chris K
2
Oh sí, definitivamente parece incorrecto, no lo hizo hace 6 años: D Ya he comentado en stackoverflow.com/a/25618630/57095 que debería ser la respuesta aceptada.
Alberto Zaccagni
ahhh maxdepth, ¿hay una opción de profundidad?
Alexander Mills
95

Hacer uso de findlas opciones de

En realidad no hay un ejecutivo de /bin/lsnecesario;

Find tiene una opción que hace exactamente eso:

find . -maxdepth 2 -type d -ls

Para ver solo el nivel de subdirectorios que le interesa, agregue -mindepthal mismo nivel que -maxdepth:

find . -mindepth 2 -maxdepth 2 -type d -ls


Usar formato de salida

Cuando los detalles que se muestran deben ser diferentes, -printfpuede mostrar cualquier detalle sobre un archivo en formato personalizado; Para mostrar los permisos simbólicos y el nombre del propietario del archivo, use -printfcon %My %uen el format.

Más tarde noté que desea la información de propiedad completa, que incluye el grupo. Úselo %gen el formato para el nombre simbólico o %Gpara la identificación del grupo (como también %Upara la identificación numérica del usuario)

find . -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'

Esto debería darle los detalles que necesita, para los archivos correctos.

Daré un ejemplo que muestra valores realmente diferentes para el usuario y el grupo:

$ sudo find /tmp -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'
drwx------ www-data  www-data /tmp/user/33
drwx------ octopussy root     /tmp/user/126
drwx------ root      root     /tmp/user/0
drwx------ siegel    root     /tmp/user/1000
drwxrwxrwt root      root     /tmp/systemd-[...].service-HRUQmm/tmp

(Editado para facilitar la lectura: sangría, última línea acortada)


Notas sobre rendimiento

Aunque el tiempo de ejecución es principalmente irrelevante para este tipo de comando, el aumento en el rendimiento es lo suficientemente grande aquí como para que valga la pena señalarlo:

No solo ahorramos creando un nuevo proceso para cada nombre, una tarea enorme , sino que la información ni siquiera necesita leerse, como findya lo sabemos.

Volker Siegel
fuente
99
Esta debería ser la respuesta aceptada, mucho mejor que la mía.
Alberto Zaccagni
1
@AlbertoZaccagni Creo que nos gustan las respuestas cortas para que las cosas funcionen rápidamente.
anddero
65

tree -L 2 -u -g -p -d

Imprime el árbol de directorios en un formato bonito hasta la profundidad 2 (-L 2). Imprimir usuario (-u) y grupo (-g) y permisos (-p). Imprimir solo directorios (-d). El árbol tiene muchas otras opciones útiles.

Sameer
fuente
12
El árbol es amor. El árbol es vida.
yosefrow
Simplemente tree -L 2 xxx/o tree -L 2 -d xxx/es suficiente para algún caso.
Eric Wang
1

Todo lo que realmente me interesa es la información de propiedad y permisos para los subdirectorios de primer nivel.

Encontré una solución fácil mientras jugaba mi pez, que se adapta perfectamente a tus necesidades.

ll `ls`

o

ls -l $(ls)
recolic
fuente