Respuestas:
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.
ls -d -- */
y ls -d */
?
--
se usa convencionalmente para marcar el final de las opciones, de modo que si un archivo se llama -l
ls no lo interpretará como la opción de formato de listado largo.
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)
ls -d -- */
opción, ya que find
tambié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
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 find
salida en algunos entornos, use esto:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
"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
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 -d
se 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/
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.
También puedes usar:
du
O:
git ls-tree -d -r --name-only @