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)?

Amelio Vazquez-Reina
fonte
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.

Gilles 'SO- parar de ser mau'
fonte
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/* [email protected]:/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.

Kristian
fonte
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.

Caleb
fonte
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.

shadowv
fonte
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).

Peter
fonte
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.

Gehendra Acharya
fonte