Usando o rsync para mover (não copiar) arquivos entre diretórios?


55

Estou usando o rsync para copiar arquivos há algum tempo. Meu entendimento é que o rsync é mais rápido que o cp quando alguns dos arquivos a serem transferidos já estão no diretório de destino, transferindo apenas a diferença incremental (ou seja, os "deltas").

Se isso estiver correto, haveria alguma vantagem em usar o rsync para mover o conteúdo de uma pasta A , para dizer uma pasta B , com B vazio?

A pasta A possui quase 1 TB de dados (e milhões de arquivos). A transferência seria feita em uma rede local ( A e B estão em sistemas de arquivos diferentes , ambos montados em um supercomputador, por exemplo, A é NFS e B é brilho ).

Além disso, quais sinalizadores devo usar para solicitar ao rsync para mover (não copiar) arquivos de A para B (ou seja, para excluir A quando a transferência for concluída com êxito)?


7
Eu não acho que rsyncpode substituir mv. Eu esperaria mvser mais rápido na maioria dos tipos de sistemas de arquivos quando a origem e o destino estiverem dentro do mesmo sistema de arquivos, porque rsyncprecisariam fazer uma cópia, não importando o que mvfosse , e provavelmente conseguiriam mudar algumas entradas de diretório. A coisa mais próxima que posso encontrar de um rsync mvé o --remove-source-filescomando, mas isso não remove os diretórios.
— Jw013

2
Obrigado @ jw013! Apenas para esclarecer, os arquivos estão em diferentes sistemas de arquivos e a transferência seria feita em uma rede . Você sabe se isso ainda tornaria mvmais rápido?
— Amelio Vazquez-Reina

11
Bem, mvnão pode operar em uma rede - teria que depender de uma montagem local (por exemplo, NFS). Se o gargalo for a rede, rsyncprovavelmente seria mais rápido do que mvporque rsyncpode fazer a compactação.
— Jw013

2
Pela forma como cptem -uopção de copiar arquivo de origem se for mais recente que o arquivo de destino ou quando o arquivo de destino está faltando
— corrida

Respostas:


69

Você pode passar --remove-source-filespara o rsync para mover arquivos em vez de copiá-los.

Mas no seu caso, não faz sentido usar o rsync, pois o destino está vazio. Uma planície mvfará o trabalho o mais rápido possível.

No seu caso, o que pode fazer diferença no desempenho é a escolha do protocolo de rede, se você tiver escolha entre NFS, Samba, sshfs, sftp, rsync sobre ssh, tar canalizado para ssh etc. A velocidade relativa desses métodos depende sobre o tamanho dos arquivos, a largura de banda da rede e do disco e outros fatores; portanto, não há como dar conselhos gerais; você precisará executar seus próprios benchmarks.


6
Apenas para reiterar o que Caleb diz, se você está preocupado com a corrupção devido a, por exemplo, uma rede irregular, o rsync pode fazer sentido, pois verifica todos os arquivos gravados somando os blocos à medida que os gravam.
— DanielS Sterling #

5
o --remove-source-filesúnico exclui os arquivos na fonte. se você deseja limpar nossa fonte, você não precisaria executar um rm -rf (ou findtodos os diretórios e passar -delete) na fonte depois que o rsync for executado com êxito?
— Trevor Boyd Smith

11
@ DanielS.Sterling O rsync não bloqueia a soma de verificação depois de escrevê-la (usa somas de verificação para descobrir quais partes dos arquivos existentes foram atualizadas e precisam ser sincronizadas). Você pode fazer uma segunda sincronização --checksumpara solicitar a verificação dos resultados da primeira sincronização.
— Clément

19

Como --remove-source-filesnão remove os diretórios, emito os seguintes comandos para mover arquivos pelo ssh:

rsync -avh --progress --remove-source-files /home/user/mystuff/* user@external.server:/home/user/backup
find . -type d -empty -delete

Pessoalmente, gosto do --progressrecurso, pois faço essa transferência manualmente. Remova-o se você estiver usando um script. Espero que diminua as transferências marginalmente. A findopção de exclusão do comando exclui apenas diretórios vazios - não use rm -rf, pois pode excluir diretórios não vazios no caso de um arquivo não ter sido transferido. A -deleteopção ativa a -depthopção para que as árvores de diretórios vazias sejam excluídas da "parte inferior" para cima.


3
-deleteé muito mais agradável do que -exec rmdir {} +etc
— lkraav

11
Eu pularia o asterisco porque, e apenas tenho barras / caminhos à esquerda, se fizer isso localmente. Se você usar o asterisco, o rsync ignorará os arquivos ocultos, como .htaccess ou .htpasswd (se houver)
— Svetoslav Marinov

16

De maneira geral, como Gilles disse, não há vantagem em usar rsyncarquivos para mover quando mvo trabalho será mais simples e não há ganho de velocidade em potencial entre sistemas de arquivos comuns.

No entanto, existem momentos em que há uma vantagem. Em particular, se você tiver alguma dúvida sobre a estabilidade da fonte, do destino ou da máquina que está fazendo o trabalho, a utilização rsyncpermitirá retomar a capacidade. Isso pode ser uma vantagem notável se a transferência for muito grande e, por exemplo, sua rede elétrica não for confiável. Usar o rsync será uma maneira mais estável de evitar a corrupção de dados no caso de uma falha e continuar de onde você parou.


5
Eu diria que esta é uma enorme vantagem. Na verdade, eu diria que mvsó é melhor se o destino e a origem estiverem na mesma partição, de modo que mvapenas edite os metadados do arquivo em vez de fazer uma cópia.
— nomen 30/05

2
Uma vez que eu preciso, em rsyncvez de mv, é quando quero preservar a estrutura da pasta (se você usar --relative).
— Sridhar Sarnobat

15

haveria alguma vantagem em usar o rsync para mover o conteúdo de uma pasta A, para dizer uma pasta B, com B vazio?

Eu me encontrei em uma situação em que o rsync É mais rápido que o mv simplesmente porque o mv não pode lidar com o número de arquivos no diretório. Tenho 1,8 milhão de fotos de uma câmera de segurança que foi executada por 20 dias e o comando mv sai com falha porque não pode alocar recursos.

No entanto, o rsync parece lidar com todos os arquivos sem problemas.


1

Se você deseja mesclar diretórios recursivamente ... mova um diretório para outro com nomes potencialmente duplicados , veja minha resposta aqui em serverfault.com. mvfaz um trabalho ruim quando os diretórios existem com o mesmo nome e rsynccopia (ler + gravar dados completos) todos os arquivos, em vez de apenas movê-los (somente leitura e gravação de metadados).


0

Não há como realmente mover arquivos usando o rsync, como faria o comando Linux mv. Ao usar --remove-source-files, você está essencialmente copiando arquivos para o destino e excluindo arquivos (exceto diretórios) da fonte. Isso pode atingir seu objetivo de mover arquivos, mas você NÃO economizará tempo ou operação de E / S.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.