Mover diretórios apesar de erros

1

Ao mover um diretório para outra unidade, se houver erros no processo, nada será excluído. Estou recebendo esse tipo de erro:

mv: cannot stat ‘originaldirectory/longpath/irrelevantfile’: Input/output error

Gostaria que mv :

  • tente novamente algumas vezes (pode ser assim tão fácil, provavelmente isso não resolve nada)
  • exclua os arquivos que foram movidos com êxito

Para que apenas os arquivos problemáticos permaneçam na pasta original.

    
por Trylks 07.01.2017 / 22:19

2 respostas

4

Existem ferramentas melhores para isso do que mv . Um dos meus favoritos é rsync .

rsync --remove-source-files -avHP /path/to/source/ /path/to/destination/

Experimente-o com o sinal --dry-run antes de usá-lo para reais, para ver o que faria se fosse permitido fazê-lo. Ou omita o sinal --remove-source-files para que funcione mais como cp that mv .

A vantagem aqui de rsync over mv é que ela é interrompível e repetível. Então, quando ele falha devido a um erro, você pode simplesmente reiniciá-lo. Ou deixe rodar um pouco:

for try in 1 2 3
do
    rsync --remove-source-files -avHP /path/to/source/ /path/to/destination/ && break

    echo -n 'Pausing...'
    sleep 10 || break
    echo
done
    
por 07.01.2017 / 22:45
2

Primeiro, reconstrua a árvore de diretórios da origem no destino:

cd source
find -type d -exec mkdir -p destination/{} \;

O {} no find deve conter o caminho relativo de cada diretório.

Em seguida, verifique se a árvore de diretórios que você criou no destino parece boa. E tente mover cada arquivo individualmente:

cd source
find -type f -exec mv {} destination/{} \;

Eu não posso dizer o quanto isso é potencialmente perigoso. Você pode perder dados! Não tenho certeza do que o find fará se não puder stat de um arquivo. Minha esperança é que ele apenas emita um erro de mensagem e siga em frente. Mas como aparentemente você está tentando recuperar dados de um meio de dano, provavelmente está ciente de quaisquer riscos.

Se isso funcionar como pretendido, tudo o que será deixado na origem são os diretórios e os arquivos que não puderam ser movidos. Se você quiser, você pode pesquisar em SO como remover os diretórios vazios de forma recursiva (tenho 100% de certeza que isso foi perguntado antes) para facilitar sua análise.

Eu sugiro que você faça um pequeno caso de teste no meio danificado. mkdir alguns diretórios, touch alguns arquivos aleatórios e tente estas etapas para ver o que acontece. Também provavelmente é uma boa idéia se você fizer isso em um diretório por vez, em vez de fazê-lo na raiz.

O que eu quero dizer é, se o seu strucutre é, por exemplo:

.
├── dir1
│   ├── fileA
│   └── subdir1
│       └── fileB
├── dir2
│   └── fileC
└── dir3
    ├── subdir1
    │   └── fileD
    └── subdir2
        └── fileE

Em seguida, execute-o 3 vezes; uma vez em dir1 , se tudo correr bem, mova para dir2 e dir3 , em vez de fazer tudo de uma só vez em . .

    
por 07.01.2017 / 22:37