bash glob não se comporta como esperado (coloca o diretório pai como parâmetro)

3

Eu estou tentando copiar o código-fonte de um projeto para outro diretório, mas não quero copiar o diretório .git (já que é grande e desnecessário para mim) eu tentei usar isso:

cp -r ~/source/!(.git) ~/destination

mas copiou o diretório pai da origem (neste caso o diretório ~ / home) para o destino. Eu tentei replicá-lo usando esses comandos e parece funcionar sem globbing:

user1@user1:~$ mkdir test
user1@user1:~$ mkdir test2
user1@user1:~$ mkdir test/orig
user1@user1:~$ touch test/file1
user1@user1:~$ touch test/orig/file2
user1@user1:~$ ls test
file1  orig
user1@user1:~$ ls test/orig
file2
user1@user1:~$ cp -r test/orig/. test2
user1@user1:~$ ls test2
file2

mas, uma vez que eu tento omitir o subdiretório com o globbing, ele também copia o pai:

user1@user1:~$ rm test2/*
user1@user1:~$ ls test2
user1@user1:~$ mkdir test/orig/.sub
user1@user1:~$ cp -r test/orig/!(.sub) test2
cp: will not create hard link 'test2/orig' to directory 'test2/.'
user1@user1:~$ ls test2
file1  file2

imprimir o que está na expressão expandida mostra que ele é realmente traduzido para três termos, um dos quais é o diretório pai:

user1@user1:~$ echo test/orig/!(.sub)
test/orig/. test/orig/.. test/orig/file2

isso é um bug no bash ou não estou usando o glob corretamente?

    
por AntiMatterDynamite 22.04.2018 / 10:45

1 resposta

2

Não sei se esse é o comportamento pretendido, mas parece que ele pode ser evitado usando a variável GLOBIGNORE para restringir esses padrões:

$ echo test/orig/!(.sub)
test/orig/. test/orig/.. test/orig/file2
$ GLOBIGNORE='?(*/)@(.|..)*(/)'; echo test/orig/!(.sub)
test/orig/file2
    
por 22.04.2018 / 11:33