*
é 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
, mksh
nem 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/
zsh
também corrigiu essa outra falha no shell Bourne, pois se o padrão não corresponder, o mv
comando 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 bash
nã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
, bash
não inclui .
nem ..
em globs como *
, mas ainda faz para globs como .*
.
Se você definir a GLOBIGNORE
variável como algo não vazio, ela ativará automaticamente a dotglob
opção e excluirá .
e ..
de .*
globs, mas não de dir/.*
ou .*/file
ones (!), 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 dotglob
ativado) expandir arquivos de ponto, exceto .
e ..
.
peixe
fish
globs 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 -- /dest
se não houver nenhum arquivo.
ksh93
Nenhum qualificador glob ksh93
também. Você pode incluir arquivos de ponto nos globs com:
FIGNORE='@(.|..)'
Contrariamente à bash
s' GLOBIGNORE
, isso é feito corretamente e também corrige o problema de .*
incluindo .
e ..
.
yash
yash
tem uma dot-glob
opçã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 ..
).