¿Cómo enumerar carpetas usando comandos bash?

52

¿Hay alguna manera de enumerar solo las carpetas en un directorio usando comandos bash? (ya que el lscomando enumera todos los archivos y carpetas)

SpiXel
fuente

Respuestas:

66

Puedes usar:

ls -d -- */

Como todos los directorios terminan en /, esto enumera solo los directorios en la ruta actual. La opción -d garantiza que solo se impriman los nombres de directorio, no sus contenidos.

Garfio
fuente
2
ls - * / enumera todos los directorios con su contenido a continuación
Vins
2
@ 8088 ¿Cuál es la diferencia entre ls -d -- */y ls -d */?
Louis
55
@Louis, --se usa convencionalmente para marcar el final de las opciones, de modo que si un archivo se llama -lls no lo interpretará como la opción de formato de listado largo.
Cristian Ciupitu
29

La respuesta de Stephen Martin dio una advertencia y también enumeró la carpeta actual, por lo que sugeriría

find . -mindepth 1 -maxdepth 1 -type d

(Esto está en Linux; no pude encontrar -maxdepth y -mindepth en la página de manual de POSIX para buscar)

daniel kullmann
fuente
1
Pregunta anterior lo sé. Si bien inicialmente también buscaría esta tarea, me gusta la ls -d -- */opción, ya que findtambién encontraré directivas ocultas. Lo que a veces puede ser útil, pero también a veces causa problemas. Espero que este comentario pueda ayudar a otros. +1
matchew
12
find . -maxdepth 1 -type d

Enumerará solo las carpetas. Y como señaló Teddy, necesitará -maxdepth para evitar que se vuelva a colocar en subdirectorios

0x7c0
fuente
55
Probablemente -maxdepth 1también quieras .
Teddy
6

La respuesta de Daniel es correcta. Aquí hay algunas adiciones útiles, sin embargo.

Para evitar enumerar carpetas ocultas (como .git), intente esto:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \)

Y para reemplazar la barra diagonal de puntos temida al comienzo de la findsalida en algunos entornos, use esto:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'
Mathias Bynens
fuente
1

"Se supone que no debe" analizar la salida de ls, o eso se dice. El razonamiento detrás es que la salida está destinada a ser legible por humanos y eso puede hacer que sea innecesariamente complicado analizar, si mal no recuerdo.

si no desea ls o find, puede intentar filtrar "*" con "[-d]".

Hice exactamente eso, por alguna razón ls y descubrí que no funcionaban (supongo que los nombres de archivo con espacios y corchetes, o algo más que estaba pasando por alto), luego hice algo en la línea de

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
el debianer solitario
fuente
0

Solo para enfatizar algo que me confundió aquí, con respecto a la selección de patrones globales; di que tienes esto:

$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03

8 directories, 8 files

Entonces, diga aquí que desea seleccionar solo mydir*directorios. Tenga en cuenta que si omite la barra diagonal final, también ls -dse enumerarán los archivos:

$ ls -d testglob/mydir*   # also `ls -d -- testglob/mydir*`
testglob/mydir_00      testglob/mydir_01      testglob/mydir_02      testglob/mydir_03
testglob/mydir_00.txt  testglob/mydir_01.txt  testglob/mydir_02.txt  testglob/mydir_03.txt

... sin embargo, con una barra diagonal final, solo se enumeran los directorios:

$ ls -d testglob/mydir*/   # also `ls -d -- testglob/mydir*/`
testglob/mydir_00/  testglob/mydir_01/  testglob/mydir_02/  testglob/mydir_03/
sdaau
fuente
0

printf "%s\n" */ enumerará todos los directorios en $ PWD.

echo */ También funcionará, pero en una línea larga, más difícil cuando los nombres tienen espacios.


fuente