Deve ser uma pergunta popular, mas não consegui encontrar uma resposta.
Como mover todos os arquivos via * incluindo arquivos ocultos, bem como para o diretório pai, como este:
mv /path/subfolder/* /path/
Isso moverá todos os arquivos para o diretório pai como esperado, mas não moverá os arquivos ocultos. Como fazer isso?
cp -r /path/to/source/. /destination
Respostas:
Você pode encontrar um conjunto abrangente de soluções para isso na resposta do UNIX e Linux para Como você move todos os arquivos (incluindo os ocultos) de um diretório para outro? . Ele mostra soluções em Bash, zsh, ksh93, padrão (POSIX) sh, etc.
Você pode usar esses dois comandos juntos:
Ou todos juntos ( obrigado pfnuesel ):
Que se expande para:
(exemplo:
echo a{.,}b
expande paraa.b ab
)Observe que isso mostrará alguns avisos:
Basta ignorá-los: isso acontece porque
/path/subfolder/{.,}*
também se expande para/path/subfolder/.
e/path/subfolder/..
, que são o diretório e o diretório pai (consulte O que significam “.” E “..” quando em uma pasta? ).Se você quiser apenas copiar, você pode usar um mero:
Isso irá copiar todos os arquivos, normais e ocultos, desde que se
/path/subfolder/.
expanda para "tudo deste diretório" (Fonte: Como copiar com cp para incluir arquivos ocultos e diretórios ocultos e seus conteúdos? )fonte
mv /path/subfolder/* /path/subfolder/.* /path/
, não sendo estritamente necessário para combinar os dois comandos em um.mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
.
denota o diretório atual e..
denota oup
diretório. Você deve ter notado que todos os outros arquivos foram movidos.Acho que este é o mais elegante, pois também não tenta se mover
..
:fonte
..anything
ou...anything
etc. - stackoverflow.com/a/31438355/2351568 contém o regex correto para este problema. || mas mesmo assim, usarshopt -s dotglob
ainda é a melhor solução!{a,b}*
encontraria todos os arquivos começando com a ou b, como "anatomia" e "bulldozer". A segunda correspondência é apenas uma correspondência vazia, equivalente a*
, e a primeira correspondência é equivalente a.[!.]
, onde o grupo[!.]
significa um grupo que NÃO começa com a.
. Isso significa,.*
mas não..*
.Você pode ligar
dotglob
:Para desligar
dotglob
, você precisa dizer:fonte
man shopt
não funciona ehelp shopt
é muito breve. Mas você pode fazerbashman () { man bash | less -p "^ $1 "; }
e, em seguida,bashman shopt
ler tudo sobre isso diretamente. (Pode ser necessário apertar n para pular para o comando se houver linhas começando com shopt, como descobri.)ls
.. portanto, não é realmente o que você deseja, provavelmenteUma solução alternativa mais simples é usar o
rsync
utilitário:Nota: o comando acima mostrará o que será alterado. Para executar as mudanças reais, remova
--dry-run
.A vantagem é que a pasta original (
subfolder
) seria removida, bem como parte do comando, e ao usarmv
exemplos aqui você ainda precisa limpar suas pastas, sem mencionar dor de cabeça adicional para cobrir arquivos ocultos e não ocultos em um único padronizar.Além disso,
rsync
oferece suporte para copiar / mover arquivos entre controles remotos e garantir que os arquivos sejam copiados exatamente como eram originalmente (-a
).O
-u
parâmetro usado ignoraria os arquivos mais recentes existentes,-r
recursaria nos diretórios e-v
aumentaria o detalhamento.fonte
sudo
e--dry-run
, para que as pessoas possam testar as alterações antes de executar o comando real para evitar qualquer confusão em potencial.Deixe-me apresentá-lo ao meu amigo "dotglob". Liga e desliga se "*" inclui ou não arquivos ocultos.
O padrão é "desligado".
É melhor ligá-lo novamente quando terminar, caso contrário, você confundirá as coisas que presumem que estará desligado.
fonte
Usando o
find
comando em conjunto com omv
comando, você pode evitar que omv
comando tente mover diretórios (por exemplo,..
e.
) e subdiretórios. Aqui está uma opção:Existem problemas com algumas das outras respostas fornecidas. Por exemplo, cada um dos seguintes tentará mover subdiretórios do caminho de origem:
Além disso, 2) inclui o. e .. arquivos e 3) perder arquivos como ..foobar, ... barfoo, etc.
Você poderia usar
mv /source/path/{.[!.],..?,}* /destination/path
,, que incluiria os arquivos perdidos por 3), mas ainda tentaria mover subdiretórios. Usar ofind
comando com omv
comando descrito acima elimina todos esses problemas.fonte
Minha solução para este problema quando tenho que copiar todos os arquivos (incluindo
.
arquivos) para um diretório de destino mantendo as permissões é: (sobrescrever se já existir)yes
é para sobrescrever arquivos de destino automaticamente,r
recursivo,v
detalhado,p
retém permissões.Observe que o caminho de origem não termina com um
/
(portanto, todos os arquivos / diretório e arquivos .são copiados)O diretório de destino termina com,
/
pois estamos colocando o conteúdo da pasta de origem no destino como um todo.fonte
yes
seja um comando incrível para usar se você deseja substituir os arquivos de destino, nem sempre é desejado. Use-o apenas se tiver certeza de que deseja fazer isso. Além disso, há uma diferença entreyes | cp ...
ecp -f ...
?