¿Por qué este comodín no funciona como yo esperaba?

11

En mi carpeta de usuario, tengo carpetas como D ropbox, D ocuments, D ownloads & d ump.

ls a*debe enumerar todos los archivos cuyo nombre comienza con a. ¿Derecho? Pero cuando doy el comando ls d*, en lugar de solo mostrarlo dump, me muestra el ls del directorio de volcado. Y cuando doy el comando como ls D*, entonces muestra ls de todas las carpetas que comienzan con D

Entonces, ¿qué parte me perdí en entenderlo?

Editar: Adjuntar una captura de pantalla captura de pantalla de ls

Ashfame
fuente

Respuestas:

17

De acuerdo con la página de manual de bash:

bash escanea cada palabra para los caracteres *,? y [. Si aparece uno de estos caracteres, la palabra se considera un patrón y se reemplaza por una lista ordenada alfabéticamente de nombres de archivos que coinciden con el patrón.

y desde el nodo de información para ls

El programa 'ls' enumera información sobre archivos (de cualquier tipo, incluidos directorios). Las opciones y los argumentos de archivo se pueden mezclar arbitrariamente, como de costumbre.

Para los argumentos de la línea de comandos que no son opciones que son directorios, de forma predeterminada 'ls' enumera el contenido de los directorios, no de forma recursiva, y omite archivos con nombres que comienzan con '.'. Para otros argumentos no opcionales, de forma predeterminada, `ls 'enumera solo el nombre del archivo. Si no se especifican argumentos que no sean opciones, 'ls' enumera el contenido del directorio actual.

así que cuando das ls d*, d * se expande a la lista ordenada de todos los nombres de archivo / directorio que comienzan con d. Entonces tu comando se convierte

ls dump

y como dump es un nombre de directorio, entonces obtienes la lista de todos los archivos en el directorio "dump" pero cuando das ls D*, D * se expande a " Dropbox de descargas de documentos de escritorio ", por lo que el comando se convierte en

ls Desktop Documents Downloads Dropbox

y como todos estos son directorios, obtienes la lista de archivos en un directorio individual. Si hubiera un archivo que comenzara con D en el directorio actual, se habría enumerado por separado.

binW
fuente
2
Una adición menor: cuando se proporciona más de un directorio como argumento, ls muestra el nombre de cada directorio antes de enumerar su contenido. No lo hará para un solo directorio.
Marcel Stimberg
¡Gracias! Eso despejó mi duda. Hice una ls p*y presenté un archivo porque existe y una ls P*muestra de la Imágenes públicas carpeta que no hay ningún archivo empezando por P . Y cuando he creado un directorio llamado caca , que apareció enls p*
Ashfame
7

ls d * y D * ambos enumeran archivos y carpetas que coinciden con d * y D * respectivamente, el comportamiento es el mismo, debe haber habido un error en su prueba.

Si desea enumerar solo los nombres de carpeta y no el contenido de la carpeta, debe usar "-d":

ls -d D*
João Pinto
fuente
He adjuntado una captura de pantalla, por favor, eche un vistazo
Ashfame
0

Como se sugirió anteriormente, la -dopción es el camino a seguir. Agregando

alias ld='ls -d'

a mi ~/.bashrcarchivo me funciona bien.

usuario3179473
fuente
3
Con este alias, bloquea el acceso fácil a ld - The GNU linker, lo que evitará que el OP compile y vincule programas. Usar en su alias lsd='ls -d'lugar. Antes de aliasar algo como foosiempre lo hace type foopara ver si fooya se usa como nombre para algo, y decidir si la conveniencia del alias anula la pérdida de acceso al anteriorfoo
waltinator