O caractere de estrela ( *
) é um caractere curinga. Há um certo conjunto de caracteres que tomará o lugar e o primeiro caractere sendo um ponto ( .
) não é um deles. Este é um caso especial apenas por causa do funcionamento dos sistemas de arquivos Unix, os arquivos que começam com um ponto são considerados "ocultos". Isso significa que ferramentas como cp
, ls
, etc. não as "verão", a menos que explicitamente instruído a fazê-lo.
Exemplos
Primeiro, vamos criar alguns dados de amostra.
$ mkdir .dotdir{1,2} regdir{1,2}
$ touch .dotfile{1,2} regfile{1..3}
Agora temos o seguinte:
$ tree -a
.
|-- .dotdir1
|-- .dotdir2
|-- .dotfile1
|-- .dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
'-- regfile3
Agora vamos jogar alguns jogos. Você pode usar o comando echo
para listar o que um curinga em particular ( *
) seria para um determinado comando da seguinte forma:
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo reg*
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2
$ echo .* *
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .dotdir*
.dotdir1 .dotdir2
Mudando o comportamento?
Você pode usar o comando shopt -s dotglob
para alterar o comportamento de *
, de modo que, além de arquivos como regfile1
, ele também corresponda a .dotfile1
.
trecho da página bash
man
dotglob If set, bash includes filenames beginning with a '.' in the results
of pathname expansion.
Exemplo:
$ shopt -s dotglob
$ echo *
.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
Você pode reverter esse comportamento com este comando:
$ shopt -u dotglob
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
Sua situação?
Para você, você está dizendo a cp
que deseja copiar todos os arquivos que correspondem ao padrão *
e não há arquivos.
$ cp foo/.* .
Ou você pode fazer isso se quiser tudo na pasta foo
:
$ cp foo .
Ou você pode ser explícito:
$ cp foot/.* foo/* .
Uma forma mais compacta usando a expansão de chave em bash
:
$ cp foo/{.,}* .
A qualquer momento, você pode usar o truque echo
para ver quais são os padrões de arquivo propostos (esse é o termo sofisticado do qual a estrela faz parte).
$ echo {.,}*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 abc regdir1 regdir2 regfile1 regfile2 regfile3
Aliás, se você vai copiar um diretório de arquivos + outros diretórios, você geralmente quer fazer isso de forma recursiva, essa é a -R
que alterna para cp
:
$ cp -R foo/. .