
Me cuesta entender cómo funciona ls -d. He leído las otras preguntas de ls -d pero ninguna pregunta por qué ls -d *
no funciona de la misma manera que ls -d */
. ¿Por qué es tan importante el carácter separador al final?
ls *
y ls */
comportarme de la misma manera, así que esperaba ls -d *
trabajar ls -d */
de la misma manera también.
En su lugar,
ls -d *
enumera todos los archivos en el directorio actual tal como lo hace ls
, mientras que ls -d */
enumera el directorio en el directorio actual. ¿Por qué esto es tan?
Respuesta1
ls *
yls */
comportarse de la misma manera.
No, no lo hacen. Si tiene archivos en su directorio de trabajo, aparecerán con el primer comando, pero no con el segundo.
ls
enumerará los archivos y directorios (incluido su contenido) pasados en la línea de comando. Si usa shell globbing, su shell reemplazará alpatrones"con una lista de nombres de archivos ordenados alfabéticamente" (cf.Expansión de nombre de archivo).
El patrón *
coincidirá con todos los archivos y directorios del directorio actual (excluyendo los archivos ocultos que comienzan con .
), mientras que */
solo coincidirá con los directorios (excluyendo los directorios ocultos).
El modificador -d
desactiva la lista de contenidos de los directorios, pero los archivos pasados a ls seguirán apareciendo en la lista.
Respuesta2
La respuesta es: el final /
obliga a ls a mirar solo directorios.
Tenga en cuenta que el comportamiento es coherente (con y sin -d
).
Una pequeña prueba:
mkdir /tmp/test
touch /tmp/test/a
mkdir /tmp/test/b
touch /tmp/test/b/c
cd /tmp/test
Y luego hazlo ls *
y ls */
notarás la diferencia.