*é uma glob que é expandida pela casca. Por padrão, os shells não incluem arquivos cujo nome começa com um .(chamado arquivos ocultos ou arquivos de ponto), a menos que o líder .seja inserido literalmente.
*ou [.]*ou ?*ou *.*ou dir/*não incluirá arquivos de ponto.
.*ou dir/.*vontade.
Então você poderia fazer:
mv -- * .* /dest/
no entanto, alguns shells, incluindo bash(mas não zsh, mkshnem fish) têm essa característica incorreta de que a expansão de .*inclui as entradas de diretório especiais .e ..que você não deseja aqui (e geralmente nunca deseja que uma glob inclua, e é por isso que eu a chamo de característica incorreta).
Por esse motivo, você verá que às vezes as pessoas usam (em conchas tipo Bourne):
mv -- * .[!.]* ..?* /dest/
São três globs, o primeiro correspondendo a arquivos não ocultos, o segundo nome de arquivo começando com .seguido por um caractere diferente de .e o terceiro nome de arquivo começando com ..seguido por pelo menos um caractere.
No entanto, algumas conchas modernas têm maneiras melhores de contornar isso
zsh
Com zsh, você pode usar o (D)qualificador glob para especificar que o glob deve incluir arquivos de ponto:
mv -- *(D) /dest/
zshtambém corrigiu essa outra falha no shell Bourne, pois se o padrão não corresponder, o mvcomando não será executado.
Como dito acima, também nunca incluirá .nem ..em seus globs, então
mv -- * .* /dest/
estará seguro. No entanto, se não houver nenhum arquivo correspondente *ou nenhum arquivo correspondente .*ao comando será abortado, seria melhor usar:
mv -- (*|.*) /dest/
Como em alguns outros shells, você também pode forçar todos os globs a incluir arquivos de ponto (por exemplo, se você deseja que os arquivos de ponto sejam incluídos com mais frequência do que não) com:
setopt dotglob
ou:
set -o dotglob
Depois disso, se você quiser que um determinado globo não inclua arquivos de ponto, você pode escrevê-lo:
echo *(^D)
Ou:
echo [^.]*
Bater
Infelizmente bashnão tem qualificadores glob. Portanto, você fica com a ativação da inclusão do dotfile globalmente. Em bash, a sintaxe é:
shopt -s dotglob
(e use [^.]*para globs sem arquivos ocultos).
Com dotglob, bashnão inclui .nem ..em globs como *, mas ainda faz para globs como .*.
Se você definir a GLOBIGNOREvariável como algo não vazio, ela ativará automaticamente a dotglobopção e excluirá .e ..de .*globs, mas não de dir/.*ou .*/fileones (!), Para que a proteção seja bastante inútil. Você poderia fazer, GLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'mas então isso quebraria globs como */.ou ./*ou ../*.
Uma solução melhor é usar [.]*ou dir/[.]*ou [.]*/file(com dotglobativado) expandir arquivos de ponto, exceto .e ...
peixe
fishglobs não incluem .nem ... Quando não há correspondência, dependendo da versão, funcionará como zsh(ou bash -o failglob) ou bash -o nullglob.
mv -- * .* /dest/
Funcionaria se houver arquivos ocultos e não ocultos. Caso contrário, o YMMV e com algumas versões poderá ser chamado mv -- /destse não houver nenhum arquivo.
ksh93
Nenhum qualificador glob ksh93também. Você pode incluir arquivos de ponto nos globs com:
FIGNORE='@(.|..)'
Contrariamente à bashs' GLOBIGNORE, isso é feito corretamente e também corrige o problema de .*incluindo .e ...
yash
yashtem uma dot-globopção ( set -o dot-glob), mas, ao contrário bash, as expansões glob (inclusive de *) incluem .e, ..portanto, são bastante inúteis.
tcsh
set globdot
Obras como em bash, que é *incluir arquivos dot exceto .e ..mas .*ainda inclui .e ..(e você pode usar [.]*para expandir os arquivos ocultos, exceto .e ..).