uso de * na pesquisa de arquivos

9

ao ler sobre a pesquisa de arquivos linux, recebi o seguinte ...

Para procurar arquivos usando o curinga *, substitua a sequência desconhecida por *, por exemplo, se você se lembrar apenas de que a extensão era .out, digite ls * .out

e quando eu tentei o seguinte comando no sistema (ubuntu 14.04 LTS) ..

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

no primeiro caso, por que ele não mostra esse diretório ( *.bash*) e, no próximo caso, mostra os arquivos ( .bash*)

Eu sou novo nesse sabor e, de acordo com minhas classes de teoria de autômatos (*), qualquer combinação de cadeias de caracteres, incluindo epsilon (vazio) ,, Então, por que os resultados são diferentes nos dois casos?

Lázaro
fonte

Respostas:

11

Quando você faz, ls *o *está sendo expandido antes de ser passado para ls. Ou seja, se temos três arquivos ( a, be c) em um diretório ls *está realmente em execução ls a b c.

Quando o Bash não pode se expandir, ele passa pela cadeia bruta¹. É por isso que você vê os curingas no erro, junto com uma mensagem não encontrada. lstentou mostrar a listagem de um arquivo chamado literalmente *.bash*.

Então, por que isso não se expandiu? Bem, por globbing padrão (como essa expansão de curinga é chamada) não retornará arquivos ocultos. Você pode alterar isso com shopt -s dotglob(que não persistirá, a menos que você o cole no seu .bashrc- ele pode ser desativado por padrão por um bom motivo, portanto, tenha cuidado) - aqui está uma demonstração rápida:

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

A exceção a isso é - como você já mostrou - quando já declarou explicitamente que os arquivos serão ocultados com um padrão semelhante .bash*. Ele simplesmente substitui a dotglobconfiguração padrão :

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

De qualquer forma, além dessa peculiaridade, espero que isso ajude você a entender o que está acontecendo sob a superfície.


Há outras shoptbandeiras que alteram como englobamento obras: extglob, failglob, globstar, nocaseglobe nullglob. Eles e uma série de outras shoptbandeiras são documentados como parte do manual do Bash .

Da mesma forma, a página Correspondência de padrões deve proporcionar uma boa leitura.

¹ A menos que failglobou nullglobestão definidos.

Oli
fonte
thanx @Oli ,, eu não obter todos os que, como eu mencionei que eu sou novo para este sabor ,, mas eu tenho 80% do que ... Ele me ajudou
Lazarus