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?
fonte
cmp
vez de hash. Tem dependências e os mesmos problemaswhile read
mencionados 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.--delete-during receiver deletes during the transfer
e também várias outras alternativas úteis:--delete --delete-before --delete-delay --delete-after --delete-excluded
. Então, sim, rsync é a melhor alternativa,mv
comando não funciona? Talvez com*
anexado ao caminho de origem, se a fonte original fosse um diretório.rsync --delete*
que seria um desastre ! Ele removerá itens dosdest
quais não estão atualmentesrc
, portanto todos os arquivos que foram movidos com sucesso na tentativa anterior agora serão excluídos! Você provavelmente estava pensando norsync --remove-source-files
que eu concordo seria uma boa alternativa. ( more1 , more2 )rsync --delete
será ú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.Respostas:
Esqueça de tentar reinventar o rsync e use o rsync.
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á existiamdrive2
,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-existing
opção para rsync para ignorar arquivos que já existem no destino, independentemente do seu conteúdo. Observe que, se o originalmv
for interrompido no meio da criação de um arquivo, esse arquivo permanecerá em seu estado de meia cópia (enquanto umarsync -a
có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
mv
em 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.fonte
rsync
faz o que você está tentando fazer, enquantomv
nã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/rsyncmv
(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, utilizareirsync
se 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,mv
oucp
não.