¿Hay alguna manera de llegar ls
a mostrar solo directorios en lugar de archivos y directorios?
Desde la página del manual:
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
Entonces, si lo escribo en el /
directorio, espero ver solo directorios. En su lugar, muestra "."
$ cd /
$ ls -d
.
Esperaba ls -d
mostrarme esto:
$ ls -d
bin data home opt sbin sys var
boot dev lib media proc selinux tmp
cdrom etc lost+found mnt root srv usr
¿Hay alguna manera de llegar ls
a mostrar solo directorios en lugar de archivos y directorios?
-d
no significa enumerar solo directorios, significa no enumerar los contenidos del directorio. Intente escribirls */
y verá el contenido de todos los directorios.ldir
dualizada als -d */
en mi.bashrc
para hacer esto más fácil ...Respuestas:
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 deldir
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
lo que el
ls
comando mismo recibe del shell es (algo así como)Lo que hace la opción
-d
/--directory
es desactivar lo que normalmente sucede después . Lo que normalmente sucede a continuación es quels
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 elfind
comando, como se explica enztank1013
, o usar el truco de que un nombre de ruta que termina con una barra inclinada implica la entrada del directorio.
, como se explica enJin
. (Jin
El truco termina con ells
comando recibiendo los argumentosporque 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ásls
: 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.fuente
dir /s *.txt
[sin recurrir a citar comodines como para encontrar]ls
podría tener una opción para filtrar archivos o directorios, y esto no es mutuamente exclusivo con hacer que el shell se expanda. No hay condición de carrera dentro de ls: puede filtrarlo ya que registra los archivos normalmente. (Ya existe una carrera entre la expansión de shell y ls, FWIW). Creo que la expansión de shell es solo una parte de la razón: la expansión de shell (y el filtrado en general) no se implementa en ls porque debería implementarse nuevamente en cp , mv, etc. Unix es un "haz una cosa y hazlo bien". Si necesita filtrado avanzado, hay herramientas para eso.ls -p
opción agrega un/
símbolo solo a los directorios. No hay ninguna razón para no extender las capacidades de impresión de salida con algo que solo produzca estos (en lugar dels -p | grep /
).ls --only-directories .
opción podría agregarsels
eventualmente.Puede usar
ls -d */
, ols -d .*/
para directorios ocultos.fuente
Prueba esto
para obtener solo directorios bajo su ubicación actual.
fuente
También podría gustarte
que enumera perfectamente todos los directorios y subdirectorios con una representación gráfica de la estructura de árbol.
fuente
tree -dL 1
Si desea ver directorios solo con detalles como la
ls -l
opción (ELL), puede usar a continuación:Lo anterior solo le dará los detalles como obtiene con la
-l
opción.fuente
find -maxdepth 1 -type d -exec ls -d {} +
para obtener la salida en ells
formato habitual .Si desea realizar el trabajo de otra manera, intente esto:
ls -l | grep ^d
Aunque una sola herramienta es suficiente en esta situación. La tubería siempre está ahí para ayudarlo. Me gusta la flexibilidad en Linux, que deseo que hagas.
fuente
Espero que esto rectifique tu necesidad. El siguiente comando enumerará solo los directorios en una ruta determinada.
Ejemplo:
fuente