Como usar a expressão _one_ shell globbing para listar todos os arquivos (claro, arquivos ocultos também!)?

7

Ok, essa questão é direcionada para shells do Unix / Linux! Eu quero uma expressão shell globbing- (aka wild-) que corresponda a todos os arquivos incluindo arquivos ocultos no diretório atual não-recursivamente (maxdepth == 1). Até agora eu tenho que executar dois comandos ou usar soluções alternativas longas (veja abaixo):

ls -lad *vim*
ls -lad .*vim*

enquanto usa o zsh. Mas se eu me lembro é o mesmo para dash e bash, certo?

Soluções alternativas:

  • ls -la | grep vim
  • find . -maxdepth 1 | grep vim

Mas eu me pergunto centenas de vezes, não existe uma solução simples para isso e por que * não combina com o caractere de ponto?

    
por math 02.01.2012 / 11:01

5 respostas

11

* faz corresponder a um caractere . .

Ele simplesmente não corresponde a . quando é o primeiro caractere do nome. Isso fornece um mecanismo chamado "arquivo de ponto" para "ocultar" arquivos.

Em zsh :

Defina a opção GLOB_DOTS shell. Isso está no § 14.8 do manual do usuário zsh . Observe que . e .. são sempre excluídos mesmo se essa opção estiver ativada.

Em bash :

Defina a opção dotglob shell. Isso está no § 3.5.8 do manual do usuário bash . Observe que a configuração da variável GLOBIGNORE da shell define implicitamente dotglob ; que bash (ao contrário de zsh ) não exclui automaticamente . e .. quando dotglob está ativado; mas que bash irá fazer isso quando GLOBIGNORE for definido. Portanto, definir GLOBIGNORE=. terá o efeito de ativar dotglob e excluindo . e .. .

No GNU find :

Não faça nada. A partir de findutils 4.2.2, o agrupamento para -name e -iname corresponde a nomes com pontos como o primeiro caractere. Isso está no § 2.1.1 do manual do usuário findutils .

    
por 02.01.2012 / 11:27
3

No bash, ative a opção dotglob :

shopt -s dotglob

Por padrão, os arquivos ocultos são ocultados para não causar surpresas e aborrecimentos - por exemplo, você executa ls em seu diretório pessoal, veja alguns arquivos do mês passado, tente removê-los com rm *net* e sem saber escrito .nethackrc .

    
por 02.01.2012 / 11:27
3

Se você não quiser alterar nenhuma opção, qualquer uma delas será:

ls -ld {,.}*vim*
ls -ld *vim* .*vim*
find . -maxdepth 1 -name "*vim*"
    
por 02.01.2012 / 15:48
2

No ZSH (sem alterar GLOB_DOTS) você poderia fazer

  ls -lad *vim*(D)
    
por 06.05.2013 / 00:20
1

Para construir a resposta de @daniel kullman, isso parece conseguir o que você quer com um glob bastante simples, embora não seja estritamente uma única gota.

Busca recursivamente pela string "blah" em todos os arquivos no diretório atual, incluindo arquivos ocultos, e excluindo o ".." que faz com que a estrutura do diretório pai seja pesquisada:

grep blah {,.}[!.]*
    
por 12.05.2014 / 17:23