Sus expectativas se basan en DOS Think / Windows Think y están equivocadas. En MS-DOS, Windows y, de hecho, en algunos otros sistemas operativos IBM / Microsoft, la expansión de comodines se realiza mediante el comando en sí, y cosas como la /a
opción del dir
comando actúan como filtros 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 se pueden asignar a la llamada del sistema para enumerar un directorio y el núcleo del sistema operativo, o sus controladores del sistema de archivos, los aplica ellos mismos).
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 *
lo que el ls
comando mismo recibe del shell es (algo así como)
ls bin home opt var boot dev tmp etc perdido + encontrado root usr
Lo que hace la opción -d
/ --directory
es desactivar lo que normalmente sucede después . Lo que normalmente sucede a continuación es que ls
examina cada uno de sus argumentos, ve que son directorios y decide enumerar sus contenidos. Para los argumentos que nombran archivos, simplemente imprime la información del archivo en sí. Con la -d
opción, los directorios se tratan como archivos. Por lo tanto, ls
imprime la información de cada uno de los directorios que se pasa como argumento, tal como lo haría si fueran archivos.
Por -d
lo tanto, no es una opción de "imprimir solo directorios". De hecho, no solo no existe tal opción; No puede haber tal opción. La expansión de comodines se realiza mediante el shell, y ( sh
al menos en un POSIX ) 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 solos, es necesario usar el find
comando, como se explica en ztank1013
, o usar el truco de que un nombre de ruta que termina con una barra inclinada implica la entrada del directorio .
, como se explica en Jin
. ( Jin
El truco termina con el ls
comando recibiendo los argumentos
ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /
porque el patrón */
de hecho hace coincidir los nombres de ruta con dos componentes, el segundo está vacío y, por lo tanto, no hace exactamente lo que deseaba. En particular, tratará los enlaces simbólicos que apuntan a directorios como si fueran directorios).
El comportamiento de ls -d
sin a *
es una simple extensión de lo anterior. Simplemente hay que saber una cosa más ls
: cuando no se le dan argumentos, se supone un argumento predeterminado de .
. Ahora sin la -d
opción, el comportamiento antes mencionado conduce al contenido del directorio nombrado al .
enumerarse y a mostrar la información de su contenido. Con la -d
opción, el directorio .
se trata como si fuera un archivo, y se muestra su propia información, en lugar de sus contenidos enumerados.