Sus expectativas se basan en DOS Think/Windows Think y son incorrectas. En MS-DOS, Windows y, de hecho, en algunos otros sistemas operativos de IBM/Microsoft, la expansión de comodines se realiza mediante el propio comando, y cosas como /a
opción al dir
El comando actúa como filtro de atributos durante la expansión de comodines. dir
expande comodines como *
, que el intérprete de comandos le pasa tal cual, y si /a
se especifica aplica los filtros apropiados a lo que se devuelve. (En algunos sistemas operativos, los filtros de atributos pueden asignarse a la llamada del sistema para enumerar un directorio y el núcleo del sistema operativo, o sus controladores de sistema de archivos, los aplica por sí mismo).
En Unices y en Linux, la expansión de comodines la realiza el shell y no tiene en cuenta los permisos. Cuando, en el directorio raíz, haces
ls *
qué demonios ls
el comando mismo recibe del caparazón es (algo así como)
ls bin home opt var boot dev tmp etc lost+found root usr
¿Qué diablos -d
/--directory
La opción que hace es desactivar lo que sucede normalmente a continuación . Lo que normalmente sucede a continuación es que ls
examina cada uno de sus argumentos, ve que son directorios y decide enumerar su contenido. Para argumentos que nombran archivos, simplemente imprime la información del archivo en sí. Con el -d
opción, los directorios se tratan como archivos. Entonces ls
imprime la información de cada uno de los directorios que se pasan como sus argumentos, tal como lo haría si fueran archivos.
Entonces -d
no es una opción de "imprimir solo directorios". De hecho, no solo no existe tal opción; no no puede ser tal opción. La expansión con comodines la realiza el shell y (en un POSIX sh
al menos) no hay forma de decirle al shell que verifique los permisos y los bits de tipo de archivo cuando se expande *
en una lista de nombres. Para obtener una lista de los nombres de los directorios solo, es necesario usar el find
comando, como se explica en ztank1013
, o para usar el truco de que un nombre de ruta que termina con una barra inclinada implica la entrada de directorio .
, como se explica en Jin
. (Jin
El truco de termina con el ls
comando que recibe los argumentos
ls bin/ home/ opt/ var/ boot/ dev/ tmp/ etc/ lost+found/ root/ usr/
porque el patrón */
de hecho, está haciendo coincidir nombres de ruta con dos componentes, el segundo está vacío, por lo que no es bastante haciendo lo que se deseaba. En particular, tratará los enlaces simbólicos que apuntan a directorios como si fueran directorios).
El comportamiento de ls -d
sin un *
es una simple extensión de la anterior. Uno simplemente tiene que saber una cosa más sobre ls
:Cuando no se le dan argumentos, asume un argumento predeterminado de .
. Ahora sin el -d
opción, el comportamiento mencionado anteriormente conduce al contenido del directorio nombrado por .
siendo enumerados y la información de su contenido mostrada. Con el -d
opción, el directorio .
se trata como si fuera un archivo y se muestra su propia información, en lugar de enumerar su contenido.
Puedes usar ls -d */
o ls -d .*/
para directorios ocultos.
Prueba esto
find . -mindepth 1 -maxdepth 1 -type d
para obtener solo directorios bajo su ubicación actual.