Seu padrão pode excluir os arquivos que você não deseja copiar, mas não exclui os diretórios que os contêm, e você disse a cp
para copiar recursivamente. Então os arquivos são copiados de qualquer maneira. Pior que isso, se você tem uma árvore fonte como
foo
foo/bar.txt
hello
hello/world
hello/world/wibble.txt
o padrão se expande para foo hello hello/world hello/world/wibble.txt
, então você acaba com esses arquivos em $TMPDIR
:
foo
foo/bar.txt
hello
hello/world
hello/world/wibble.txt
wibble.txt
world
world/wibble.txt
Isso não tem nada a ver com o padrão "não ser mais válido". O padrão é expandido pelo shell, cp
apenas vê a lista de arquivos.
Você precisa usar uma ferramenta de cópia que possa excluir arquivos enquanto realiza a travessia recursiva.
Você pode usar o zcp para isso, mas ele não copiará os diretórios e não criará diretórios de destino automaticamente. A ferramenta mais fácil para este trabalho é o rsync. Pax é outra opção.
rsync -a --exclude='*.foo/*' --exclude='bar.txt' --exclude='*.abc' --exclude='/qux.txt' $(dirname $0) $TMPDIR