Como posso fazer o bash não corresponder '.' e com '.*'

6

Quando tento corresponder todos os arquivos de ponto em um diretório com .* , parece ter um efeito colateral desagradável: além de corresponder todos os arquivos e diretórios (reais), ele corresponde a . e .. .

bash-3.2$ mv test/.* dest/
mv: rename test/. to dest/.: Invalid argument
mv: test/.. and dest/.. are identical

Isso parece muito estranho, já que eles são basicamente diretórios 'falsos', apenas para facilitar os caminhos relativos. Eles não fazem parte do conteúdo de um diretório, e eu nunca os quero correspondidos quando tento mover o conteúdo de um diretório para outro diretório. Não consigo pensar em nenhum cenário em que eu queira que eles correspondam a .* .

Então, como posso desligar isso? (Além de usar o shell Z, que nem sempre está disponível, e que pode não ser o shell em uso por alguém executando uma função que escrevi.)

    
por iconoclast 13.06.2012 / 20:05

2 respostas

9

Você pode usar a variável GLOBIGNORE bash.

       GLOBIGNORE
              A colon-separated list of patterns defining the set of filenames
              to be ignored by pathname expansion.  If a filename matched by a
              pathname  expansion  pattern also matches one of the patterns in
              GLOBIGNORE, it is removed from the list of matches.

e

       .......................-.  The file names ''.''  and ''..''  are always
       ignored  when GLOBIGNORE is set and not null.  

Então, se você definir

GLOBIGNORE='*/.:*/..'

então path/.* não corresponderá a . e .. , como você pediu.

    
por 13.06.2012 / 20:23
-1

Um padrão glob seria .[^.]* - corresponde a algo com pelo menos 2 caracteres, em que o segundo caractere não é um ponto.

A documentação para correspondência de padrões de nomes de arquivos está na página man bash ou aqui: link

Jonathan Callen levanta um bom ponto. Você pode usar um padrão estendido bastante simples

shopt -s extglob
ls -d .!(.|)
    
por 13.06.2012 / 21:44