uso de * na pesquisa de arquivos

9

enquanto lia sobre a pesquisa de arquivos linux, obtive o seguinte ...

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

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

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 está mostrando Nenhum diretório ( *.bash* ) e, no próximo caso, mostrando os arquivos ( .bash* )

Eu sou novo nesse sabor e, de acordo com minhas aulas de teoria de autômatos (*), qualquer combinação de cadeias de caracteres, incluindo épsilon (vazio) ,, Então por que os resultados são diferentes em ambos os casos ....?

    
por jazzz 03.09.2014 / 11:18

1 resposta

11

Quando você faz ls * , o * está sendo expandido antes , ele é passado para ls . Ou seja, se temos três arquivos ( a , b e c ) em um diretório ls * está realmente executando ls a b c .

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

Então por que isso não se expandiu? Bem, por padrão globbing (o que esta expansão curinga é chamado) não retornará arquivos ocultos. Você pode mudar isso com shopt -s dotglob (que não persistirá a menos que você o coloque no seu .bashrc - ele pode estar desabilitado por padrão por um bom motivo, então tenha cuidado com isso), 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 ficarão ocultos com um padrão como .bash* . Ele simplesmente substitui a configuração padrão dotglob :

$ 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 abaixo da superfície.

Existem outros shopt sinalizadores que alteram o funcionamento da globalização: extglob , failglob , globstar , nocaseglob e nullglob . Eles e uma série de outros shopt sinalizadores são documentados como parte do manual do Bash .

Da mesma forma, a página em Correspondência de padrões deve facilitar a leitura .

¹ A menos que failglob ou nullglob estejam definidos.

    
por Oli 03.09.2014 / 11:48