¿Hay una manera correcta de enumerar los subdirectorios del directorio actual?

10

Puedo encontrar los subdirectorios de un directorio por

ls -d -- */

o

ls -l | grep "^d"

pero ambos parecen indirectos, y me imagino que habría una forma estándar de encontrar solo los directorios. ¿Hay una manera correcta de hacer esto? Y si no, ¿alguno de estos conducirá a un comportamiento indeseable en casos extremos? (Enlaces simbólicos, directorios ocultos, etc.)

Eric Wilson
fuente

Respuestas:

17

La respuesta dependerá más de lo que intente hacer con la salida que de lo que está buscando. Si solo desea ver una lista de referencia visual en la terminal, su primera solución es bastante buena. Si desea procesar la salida, debería considerar usar otro método.

Una de las formas más sólidas de obtener una lista para alimentar a otro programa es utilizarla find.

find -maxdepth 1 -type d

La razón por la que esto es bueno para los canales de información es que findpuede generar los datos separados por nulos usando -print0o escapar correctamente cadenas como argumentos a otros programas que usan -exec. Para obtener una referencia sobre por qué esto es mejor que analizar la salida de ls, vea ParsingLS en el Wiki de Greg.

Caleb
fuente
44
Tuve que escribir find . -maxdepth 1 -type dpara que esto funcione en OS X Yosemite.
Sean Levin
1
Para enumerar los subdirectorios, también se debe especificar -mindepth como en find . -maxdepth 1 -mindepth 1 -type d. De lo contrario, se .incluirá el directorio actual .
tinlyx
5

FYI - En ZSH (pero no BASH), también se puede hacer esto: ls -d -- *(/); el (/)modificador le dice a ZSH solo que glob directorios

Dicho esto, no es muy diferente de su propia solución propuesta ( ls -d -- */), y está lejos de ser estándar.

En cuanto a la salida de ls(que probablemente difiere en función de otras banderas):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2
Curtis F.
fuente
zsh expande el asterisco a todos los archivos y directorios, el indicador (/) selecciona partes de esa expansión para que ls * (/) también funcione, así como echo * (/) , o una forma más zshly print -l * (/ ) . Las dos primeras versiones también funcionan en bash.
Thor
1
Tenga en cuenta que se *(/)expande a los directorios no ocultos, mientras que se */expande a directorios no ocultos o enlaces simbólicos a directorios (o al menos enlaces simbólicos a rutas para las que podemos decir que son directorios).
Stéphane Chazelas