Prática recomendada para continuar mv

13

Eu usei o terminal para copiar arquivos de uma unidade para outra.

sudo mv -vi /location/to/drive1/ /location/to/drive2/

No entanto, isso parou de repente, durante algumas horas e sem erros, após a criação de um diretório.

Minha própria solução para isso é muitas vezes uma mistura de hash e comparação, o que consome muito tempo, pois agora tenho que me recuperar de uma cópia intermediária sem saber realmente quais arquivos estão faltando (escrito como uma linha muito longa para zsh - observe que este script não funciona no bash como está escrito):

source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
    echo "${hash_and_file}" | read hash file;
    echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
    echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
    mv -v "${copy_from}" "${copy_to}" | tee -a log;
    rm -v "${copy_from}" | tee -a log; };
done <<<$(
    comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${source_directory}: :g" | sort;
           ) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${target_directory}: :g" | sort; ) )

Isso é propenso a erros se o diretório de destino do nome ou o diretório source_ fizer parte do caminho e excluir os arquivos se eles não foram movidos porque foram marcados como duplicados. Também não origina o diretório no final.

Existe uma prática recomendada como se recuperar de um MV interrompido?

o que
fonte
Eu escrevi um script semelhante , que usa em cmpvez de hash. Tem dependências e os mesmos problemas while readmencionados por Gilles. Também é lento e detalhado. Porém, libera espaço em disco antes do método rsync, porque os arquivos são (re) movidos da fonte enquanto são executados. Pode servir de inspiração para os corajosos.
Joeytwiddle 01/12/19
3
@joeytwiddle ofertas rsync --delete-during receiver deletes during the transfere também várias outras alternativas úteis: --delete --delete-before --delete-delay --delete-after --delete-excluded. Então, sim, rsync é a melhor alternativa,
Isaac
Eu devo estar esquecendo alguma coisa. Por que apenas repetir o mesmo mvcomando não funciona? Talvez com *anexado ao caminho de origem, se a fonte original fosse um diretório.
jpa
@isaac Não, receio rsync --delete*que seria um desastre ! Ele removerá itens dos destquais não estão atualmente src, portanto todos os arquivos que foram movidos com sucesso na tentativa anterior agora serão excluídos! Você provavelmente estava pensando no rsync --remove-source-filesque eu concordo seria uma boa alternativa. ( more1 , more2 )
joeytwiddle
@joeytwiddle Não, rsync --deleteserá única remover outros arquivos que não fazem parte da fonte. De [man rsync] () * exclua arquivos estranhos dos diretórios de destino *. Entenda o que significa estranho : Não está sendo sincronizado. E sim, o rsync também fornece uma maneira de remover arquivos de origem depois que eles foram transmitidos corretamente.
Isaac Isaac

Respostas:

46

Esqueça de tentar reinventar o rsync e use o rsync.

sudo rsync -av /location/to/drive1/ /location/to/drive2/

Certifique-se de usar uma barra à direita na fonte, caso contrário ela seria copiada para /location/to/drive2/drive1.

Verifique novamente se o comando foi bem-sucedido e execute rm -rf /location/to/drive1/.

O comando acima substituirá qualquer arquivo pré-existente de drive2. Se você deseja solicitar ao usuário que ignore os arquivos que já existiam drive2, mv -ié mais complicado, porque agora você precisa distinguir os arquivos que já foram copiados e os que não foram. Você pode passar a --ignore-existingopção para rsync para ignorar arquivos que já existem no destino, independentemente do seu conteúdo. Observe que, se o original mvfor interrompido no meio da criação de um arquivo, esse arquivo permanecerá em seu estado de meia cópia (enquanto uma rsync -acópia vazia terminaria corretamente a cópia).

Se você deseja reproduzir o comportamento exato de mv -i, incluindo a solicitação, isso pode ser feito, mas é muito mais complicado.

Observe que o seu forro gigante é muito frágil. Se houver nomes de arquivos que contenham barras invertidas ou novas linhas, eles podem não ser copiados corretamente ou podem até enganar seu script para remover arquivos arbitrários. Portanto , não use o código da pergunta, a menos que tenha certeza de que pode confiar nos nomes dos arquivos para não conter barras invertidas ou novas linhas.

Para referência futura, eu recomendo nunca usar mvem grandes movimentos de cross-drive, precisamente porque é difícil controlar o que acontece se for interrompido. Use rsync para fazer a cópia e remova o original.

Gilles 'SO- parar de ser mau'
fonte
Que promessas o rsync faz que o mv não faz?
O
4
bem, por exemplo, rsyncfaz o que você está tentando fazer, enquanto mvnão faz. Também: copiando entre máquinas diferentes; compressão para transferência; pular arquivos existentes no destino com base na igualdade de carimbo de data / hora ou com base em hash; manipulação configurável de propriedade, permissões, links e arquivos especiais; etc. linux.die.net/man/1/rsync
parva Anormal
1
@SillyFreak devo concluir com isso que sempre devo usar o rsync em vez do mv, não apenas como Gilles disse para cross-drive, mas qualquer operação, pois o limite de "muito grande" é relativamente subjetivo e se houver um problema teria sido resolvido pelo rsync de qualquer maneira?
O
9
bem, quando estou movendo arquivos ou diretórios dentro de uma partição, geralmente uso mv(ou o gerenciador de arquivos) porque está apenas movendo uma referência ao arquivo / diretório. Se eu precisar fazer uma transferência de dados real, utilizarei rsyncse uma das seguintes opções for verdadeira: 1) Estou movendo mais arquivos do que posso verificar a transferência correta rapidamente; 2) Prevejo que precisarei manter os arquivos sincronizados; 3) Espero que a transferência possa ser interrompida. O que quero dizer é que, para o caso de uso que você está apresentando na pergunta, rsyncé simplesmente a ferramenta certa, mvou cpnão.
parva Anormal
7
Eu recomendaria sempre executar qualquer comando rsync com -v e -dry-run primeiro para confirmar exatamente o que ele fará.
Darren