Por que esse curinga não funciona da maneira que eu esperava?


11

Em minha pasta de usuário, eu tenho pastas como D ropbox, D textos dirigidos, D ownloads & d ump.

ls a*deve listar todos os arquivos cujo nome começa com a. Certo? Mas quando eu dou o comando ls d*, em vez de apenas exibi- dumplo, mostra-me o diretório ls of dump. E quando eu der o comando como ls D*, ele exibirá sl de todas as dobras começando com D

Então, de que parte eu perdi em entender isso?

Editar: anexando uma captura de tela ls screenshot

Respostas:


17

De acordo com a página de manual do bash:

bash varre cada palavra para os caracteres *,? e [. Se um desses caracteres aparecer, a palavra será considerada um padrão e substituída por uma lista classificada alfabeticamente de nomes de arquivos que correspondem ao padrão

e do nó info para ls

O programa `ls 'lista informações sobre arquivos (de qualquer tipo, incluindo diretórios). Opções e argumentos de arquivo podem ser misturados arbitrariamente, como de costume.

Para argumentos de linha de comando que não são opções, diretórios, por padrão, 'ls' lista o conteúdo dos diretórios, não recursivamente, e omite arquivos com nomes começando com '.'. Para outros argumentos não opcionais, por padrão, `ls 'lista apenas o nome do arquivo. Se nenhum argumento não opcional for especificado, 'ls' listará o conteúdo do diretório atual.

portanto, quando você fornece ls d*, d * é expandido para a lista classificada de todos os nomes de arquivos / diretórios começando com d. Então você comando se torna

ls dump

e como dump é um nome de diretório, você obtém a listagem de todos os arquivos no diretório "dump", mas quando você fornece ls D*, D * é expandido para " Dropbox de downloads de documentos da área de trabalho ", para que o comando se torne

ls Desktop Documents Downloads Dropbox

e como todos esses são diretórios, você obtém a listagem de arquivos em um diretório individual. Se houvesse um arquivo começando com D no diretório atual, ele seria listado separadamente.


2
Uma pequena adição: quando mais de um diretório é fornecido como argumento, ls exibe o nome de cada diretório antes de listar seu conteúdo. Não o fará para um único diretório.
Marcel Stimberg

Obrigado! Isso esclareceu minha dúvida. Eu fiz um ls p*e ele mostrou-se um arquivo porque ele existe e uma ls P*mostra da Pictures Public pasta que não há nenhum arquivo começando com P . E quando eu criei um diretório chamado poo , ele apareceu emls p*
Ashfame 10/02

7

Se d * e D * listam arquivos e pastas correspondentes a d * e D *, respectivamente, o comportamento é o mesmo, deve ter ocorrido um erro no seu teste.

Se você quiser listar apenas os nomes das pastas e não o conteúdo da pasta, precisará usar "-d":

ls -d D*

Anexei uma captura de tela, por favor, dê uma olhada
Ashfame

0

Como sugerido acima, a -dopção é o caminho a percorrer. Adicionando

alias ld='ls -d'

para o meu ~/.bashrcarquivo funciona bem para mim.


3
Com esse alias, você bloqueia o acesso fácil ld - The GNU linker, o que impedirá o OP de compilar e vincular programas. Use em alias lsd='ls -d'vez disso. Antes aliasing algo como foosempre faço type foopara ver se foojá é usado como o nome para algo, e decidir se a conveniência da substituição apelido a perda de acesso ao anteriorfoo
waltinator
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.