Se eu mv
mover uma pasta chamada "pasta" para um diretório que já contenha "pasta", elas serão mescladas ou serão substituídas?
149
mv
não puder mesclar ou substituir diretórios, ele falhará com a mensagem "mv: não é possível mover 'a' para 'b': diretório não vazio" , mesmo quando você estiver usando a --force
opção
Você pode contornar isso usando outras ferramentas (como rsync
, find
ou até mesmo cp
), mas você precisa considerar com cuidado as implicações:
rsync
pode mesclar o conteúdo de um diretório em outro (idealmente com a opção --remove-source-files
1 para excluir com segurança apenas os arquivos de origem que foram transferidos com êxito e com a opção usual de permissão / propriedade / preservação de tempo, -a
se desejar) rsync
a --link-dest=DIR
opção (para criar links físicos em vez de copiar o conteúdo do arquivo, sempre que possível) e --remove-source-files
obter uma semântica muito semelhante a uma regular mv
. --link-dest
necessário fornecer um caminho absoluto para o diretório de origem (ou um caminho relativo do destino à origem ). --link-dest
maneira não intencional (que pode ou não causar complicações), requer conhecer (ou determinar) o caminho absoluto para a fonte (como argumento --link-dest
) e novamente deixa uma estrutura de diretório vazia para ser limpa como por 1 .find
para recriar seqüencialmente a estrutura do diretório de origem no destino e, em seguida, mover individualmente os arquivos reais cp
pode criar links físicos (basta colocar, ponteiros adicionais para o mesmo arquivo existente), o que cria um resultado muito semelhante a uma fusão mv
(e é muito eficiente em IO, pois apenas ponteiros são criados e nenhum dado real precisa ser copiado) Qual dessas soluções alternativas (se houver) é apropriada dependerá muito do seu caso de uso específico.
Como sempre, pense antes de executar qualquer um desses comandos e faça backups.
1: Observe que rsync --remove-source-files
não excluirá nenhum diretório, então você terá que fazer algo como find -depth -type d -empty -delete
depois para se livrar da árvore de diretórios de origem vazia.
mv
. Essa resposta seria melhor com uma verdade mais ampla. Linux, BSD e Unix "real", ou uma referência do POSIX ou SUS.mv
implementação usada pelo Debian - a ênfase estar em julgado , uma vez que a página de manual não menciona este comportamento ...--delete
apenas exclui arquivos no diretório de destino que não existem no diretório de origem.-H
função ou pode vincular os arquivos no destino usando--link-dest
. Veja a página de manual antes de usá-los.fonte
--remove-source-files
tem a vantagem de remover apenas os arquivos transferidos com êxito; portanto, você pode usarfind
para remover diretórios vazios e ficará com tudo o que não foi transferido sem ter que verificarrsync
a saída.Você pode usar a
-l
opção do comando cp , que cria links físicos de arquivos no mesmo sistema de arquivos em vez de cópias de dados completos. O comando a seguir copia a pastasource/folder
para uma pasta pai (destination
) que já contém um diretório com o nomefolder
.Você também pode usar o
-P
(--no-dereference
- não desassociar links simbólicos) ou-a
(--archive
- preservar todos os metadados, também inclui a-P
opção), dependendo de suas necessidades.fonte
cp
ao invés dersync
já que todo sistema temcp
e todos têm familiaridade com ele.cp
com o tempo de operação demv
.-n
mv /fs1/file /fs2/
(entre sistemas de arquivos) executará uma cópia e, em seguida, uma exclusão.mv
funcionará (desde que o diretório de destino ainda não exista), mesmo que não seja "eficiente" ou como você o chamar,cp -rl
falhará.Eu recomendo estas quatro etapas:
ou melhor ainda, aqui está um script que implementa semântica semelhante a
mv
:fonte
rsync -u
(somente atualizar se for mais recente),mv
(em algumas versões pelo menos) também pode usar a-u
opção. No entanto, nesse caso, convém excluir os diretórios de origem não vazios e os vazios, para cobrir os casos em que os arquivos na árvore de origem não são mais novos. @chuess: Parece que pode haver vários argumentos SOURCE, se você precisar.Aqui está uma maneira de mesclar os diretórios. É muito mais rápido que o rsync, pois apenas renomeia os arquivos em vez de copiá-los e excluí-los.
fonte
dest
já for um diretório com o mesmo nome que emsource
. E os arquivos serão movidos para umdest
, que está emsource
. O comando não faz nada mais do quemv source/* source/dest/.
Uma maneira de conseguir isso seria usar:
Contanto que não haja dois arquivos com o mesmo nome
folder
edirectory/folder
, você obterá o mesmo resultado, ou seja, mesclando.fonte
rm folder
funciona?rm folder -fR
sempre funciona para mimPara as cópias mais puras, eu uso o método de cópia em bloco (tar) tar (-) B.
Por exemplo, no caminho de origem ('cd', se necessário):
isso cria uma cópia exata da árvore de origem, COM o proprietário e as permissões intactas. E se a pasta de destino existir, os dados serão mesclados. Somente arquivos que já existem serão substituídos.
Exemplo:
Quando a ação de cópia é bem-sucedida, você pode remover a fonte (
rm -rf <source>
). Obviamente, essa não é uma ação exata: os dados serão copiados até você remover a fonte.Como opção, você pode ser detalhado (exibir na tela o arquivo que está sendo copiado), com -v:
tar cBvf -
c
: crioB
: leia bloco completo (para leitura de tubo)v
: verbosef
: arquivo a ser gravadox
: extrair-
: stdout / stdinsourcefolder
também pode ser*
(para qualquer coisa na pasta atual)fonte
f -
do tar geralmente não é necessária - o padrão é ler de stdin / write para stdout.Aqui está um script que funcionou para mim. Eu prefiro mv sobre rsync, então uso as soluções de Jewel e Jonathan Mayer.
fonte
Não é uma boa ideia usar comandos como cp ou rsync. Para arquivos grandes, levará muito tempo. O mv é muito mais rápido, pois somente atualiza os inodes sem copiar os arquivos fisicamente. Uma opção melhor é usar o gerenciador de arquivos do seu sistema operacional. Para o Opensuse, existe um gerenciador de arquivos chamado Konquerer. Ele pode mover arquivos sem realmente copiá-los. Possui a função "recortar e colar", como no Windows. Basta selecionar todos os subdiretórios no diretório A. Clique com o botão direito e "vá para" o diretório B, que pode conter subdiretórios com os mesmos nomes. Ele irá fundi-los. Também existem opções para substituir ou renomear arquivos com o mesmo nome.
fonte
mv
é usado.Solução Python
Como não consegui encontrar uma solução pré-existente satisfatória, decidi criar um script Python rápido para alcançá-la.
Em particular, esse método é eficiente porque apenas percorre a árvore do arquivo de origem uma vez que estiver de baixo para cima.
Ele também permitirá que você ajuste rapidamente coisas como manipulação de substituição de arquivos ao seu gosto.
Uso:
moverá todo o conteúdo de
src/*
paradest/
esrc/
desaparecerá.mover-mesclar-dirs
GitHub upstream .
Consulte também: https://stackoverflow.com/questions/22588225/how-do-you-merge-two-directories-or-move-with-replace-from-the-windows-command
fonte
Este é o comando para mover arquivos e pastas para outro destino:
Lembre - se : o
mv
comando não funcionará se a pasta estiver aberta (ou seja, já existe outra pasta com o mesmo nome no destino) e o diretório não está ativado .Se a pasta de destino estiver vazia, o comando acima funcionará bem.
Portanto, para mesclar as duas pastas em qualquer caso,
faça-o em 2 comandos:
Ou combine ambos como um comando único:
fonte