Listado solo de directorios en UNIX


219

Quiero enumerar solo los directorios en la ruta especificada ( lsno tiene esa opción). Además, ¿se puede hacer esto con un solo comando de línea?


12
Para el futuro: Tal vez las preguntas básicas de Unix / Linux tipo de preguntas no tan difíciles relacionadas con la programación se mantengan
echox

Respuestas:


315

Pruebe esto ls -d */para enumerar directorios dentro del directorio actual


17
Oye, eso es bastante ingenioso, siempre me acostumbré ls -al | grep '^d', esto es mucho más sucinto.
paxdiablo

43
Por que usar */ ?? ¿¡por favor explique!?
Chandeep

66
No tengo una explicación adecuada, sin embargo, sé que */obliga a mostrar solo los elementos que terminan con una barra diagonal, que en este caso sería un directorio, incluso si no se utiliza la -Fopción de ls. Similar al comportamiento de ls *phpy cómo muestra todos los archivos que terminan phpen un directorio.
David Hancock

3
@ user975234 Alguien hizo una pregunta similar, y hay una muy buena explicación publicada enlace
user1766760

17
Simplemente echo */haré lo mismo también
nos

95

Prueba esto:

find . -maxdepth 1 -type d

8
Para mí, esta parece ser la forma en que debería hacerse. A diferencia de las lssoluciones sugeridas , findes el único responsable de hacer el trabajo (no depender de la expansión de comodines de shell, que puede imponer límites). También es mucho más conciso.
oruga

1
Lo malo de esto es que no funciona si está intentando recorrer los resultados y sus resultados tienen espacios en los nombres.
ubiquibacon

2
Alternativamente, si no se desea incluir el propio directorio: find * -maxdepth 0 -type d.
James Ko

@ubiquibacon Use find's -print0u -execopción.

1
Esto es realmente lento, al menos en mi Mac. Parece hacer la búsqueda recursiva completa que findgeneralmente hace pero solo muestra las carpetas en profundidad 1.
Kara Brightwell

22

El seguimiento

find * -maxdepth 0 -type d

básicamente filtra la expansión de '*', es decir, todas las entradas en el directorio actual, por la -type dcondición.

La ventaja es que la salida es la misma ls -1 *, pero solo con directorios y entradas que no comienzan con un punto


13

Puedes usar ls -d */otree -d

Otra solución sería globbing, pero esto depende del shell que esté utilizando y si se admite globbing para directorios.

Por ejemplo ZSH:

zsh # ls *(/)

3
¿Con qué sabor de Unix obtienes tree?
Johnsyweb

todas las principales distribuciones de linux, por ejemplo? lo siento, no entiendo la pregunta?
echox

1
Tengo una distribución de Debian, y treeno está instalada por defecto (aunque está en los repositorios).
Stephen Schrauger el

1
Vota abajo porque creo que el treecomando no es un comando nativo de Unix ( corrígeme si me equivoco).
Tiago Cardoso

10

Dado que hay docenas de formas de hacerlo, aquí hay otra:

tree -d -L 1 -i --noreport
  • -d: directorios
  • -L: profundidad del árbol (de ahí 1, nuestro directorio de trabajo)
  • -i: sin sangría, solo nombres impresos
  • --noreport: no reporta información al final de la lista de árbol

Y gracias por explicar los cambios. Stack Overflow se trata de respuestas, siempre agradezco que a la gente le guste con una explicación vs. "¡solo lea la entrada del hombre!" <- esa no es una respuesta.
fusion27

Para comenzar desde la línea 2 (omita la línea con solo un punto):tree -d -L 1 -i --noreport | tail -n +2
adius

Esta es la solución mejor clasificada que enumera los directorios vinculados por software y lo hace de manera útil, exponiéndolos como un enlace. Prefiero la variación:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel

9
ls -l | grep '^d'

Puedes hacer un alias y ponerlo en el archivo de perfil

alias ld="ls -l| grep '^d'"

1
los enlaces no se ven con este comando. Y un enlace puede ser un archivo o un directorio. Ejemplo: lrwxrwxrwx 1 root root 21 avril 15 17:38 cron -> / lib / init / upstart-job.
c-toesca

7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'

☀ encontrar. -maxdepth 1 -type d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: no se encontraron coincidencias: [^.] *
Michael Cole

6

Para enumerar los directorios en el directorio de trabajo actual ls -d */se puede utilizar. Y si necesita enumerar los directorios ocultos, use este comando ls -d .*/


6

use esto para obtener una lista de directorio

ls -d */ | sed -e "s/\///g"

ls -d <ruta del directorio personalizado> | sed -e "s / \ /// g" no funciona ... ¿alguna pista?
Dhwanit

¡Gracias! Solo quería la lista de directorios sin todos los permisos y esto funcionó. :)
codingjeremy

5

find specifiedpath -type d

Si no desea recurrir en subdirectorios, puede hacerlo en su lugar:

find specifiedpath -type d -mindepth 1 -maxdepth 1

Tenga en cuenta que los directorios "punto" (cuyo nombre comienza con .) también aparecerán en la lista; pero no los directorios especiales .ni ... Si no desea directorios de "puntos", puede simplemente grepeliminarlos:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'


1
¡Vota por mencionar mindepthque debes deshacerte .! 😁
adius

5

La respuesta dependerá de su caparazón .

En zsh, por ejemplo, puede hacer lo siguiente:

echo *(/)

Y se mostrarán todos los directorios dentro del directorio de trabajo actual.

Ver man zshexpnpara más información.

Un enfoque alternativo sería el uso find(1), que debería funcionar en la mayoría de los sabores de Unix:

find . -maxdepth 1 -type d -print  

find(1)tiene muchos usos, por lo que definitivamente lo recomendaría man find.


4

Puede usar el treecomando con su dinterruptor para lograr esto.

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

ver man treepara más información.


No voté en contra, solo tuve la misma pregunta. Parece que tu respuesta es un engañado de echox, ¿quizás por eso?
Louis Waweru

1
@Louis: gracias, nunca me di cuenta de su mención tree. Oh, bueno, no era mi intención robar el trueno de nadie.
slm

votación por la visualización de lo que hace el árbol
Andrejs

Creo que los votos negativos se deben a que es la misma respuesta que stackoverflow.com/a/3667405/523742
Tiago Cardoso

@TiagoCardoso: el mío es anterior a uno por 2 años.
slm

2

Si tengo este directorio:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

Para obtener todos los directorios, use -L para resolver enlaces:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Sin -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Falta el directorio conf_nagios .


2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"

1

Esto ha estado funcionando para mí:

`ls -F | grep /`

(Pero, me estoy cambiando echo */según lo mencionado por @nos)


1

Aquí hay otra solución que muestra los directorios vinculados. Lo prefiero un poco porque es un subconjunto de la salida ls -l "normal":

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

En bash:

ls -d */

Listará todos los directorios

ls -ld */

enumerará todos los directorios en forma larga

ls -ld */ .*/

enumerará todos los directorios, incluidos los directorios ocultos, en forma larga.


Recientemente cambié a zsh (MacOS Catalina) y descubrí que:

ls -ld */ .*/

ya no funciona si el directorio actual no contiene directorios ocultos.

zsh: no matches found: .*/

Imprimirá el error anterior, pero tampoco imprimirá ningún directorio.

ls -ld *(/) .*(/)

También falla de la misma manera.

Hasta ahora he encontrado que esto:

ls -ld */;ls -ld .*/

Es una solución decente. El ;es un separador de comandos. Pero significa que si no hay directorios ocultos, enumerará los directorios y aún imprimirá el error para ningún directorio oculto:

foo
bar
zsh: no matches found: .*/

lses el comando shell de contenido de la lista de directorio actual
-les el indicador para especificar que desea a la lista en Longford (un elemento por línea + un montón de otra información fresca)
-des la bandera para listar todos los directorios "como archivos" y no de forma recursiva
*/es el argumento 'enumerar todos los archivos que terminan en una barra inclinada'
*es un simple comando regex para "cualquier cosa", por lo que */le pide al shell que enumere "cualquier cosa que termine en '/'"

Ver man lspara más información.


Pongo esto:

alias lad="ls -ld */;ls -ld .*/"

en mi .zshrc, y parece funcionar bien.

NOTA: también he descubierto que

ls -ld .*/ 2> /dev/null

no funciona, ya que todavía imprime esterr en la terminal. Actualizaré mi respuesta si / cuando encuentre una solución.


0

du -d1Es quizás la opción más corta. (Siempre que no necesite canalizar la entrada a otro comando).


0

Para enumerar solo directorios en una ruta especificada, simplemente escriba ls -l | grep drw


Esto podría incluir archivos, si alguno de los nombres de archivo incluye drw, y excluiría cualquier directorio que no sea legible y escribible por el propietario. grep ^dFunciona mejor
Tom Zych

0

Lista larga de directorios

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

Listado de directorios
- ls -d * /


¿Tiene alguna buena razón para duplicar respuestas ya existentes?
Maxim Sagaydachny
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.