Перемещение каталогов, несмотря на ошибки

При перемещении каталога на другой диск, если в процессе есть ошибки, ничего не будет удалено. Я получаю такие ошибки:

mv: cannot stat 'originaldirectory/longpath/irrelevantfile': Input/output error

Я хотел бы mv :

  • повторите попытку пару раз (может быть, это легко, возможно, это ничего не решит)
  • удалить файлы, которые были успешно перемещены

Так что в исходной папке остаются только проблемные файлы.

Для этого есть лучшие инструменты, чем mv . Один из моих предпочтительных – rsync .

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

Попробуйте его с --dry-run перед тем, как использовать его для реального, чтобы посмотреть, что он будет делать, если ему будет разрешено это делать. Или опустите --remove-source-files чтобы он работал больше как cp , чем mv .

Преимущество здесь rsync over mv том, что оно прерывается и воспроизводимо. Поэтому, когда он вылетает из-за ошибки, вы можете просто перезапустить его. Или пусть он работает в цикле для бит:

 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 

Сначала восстановите дерево каталогов источника в получателе:

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

{} В find должен содержать относительный путь для каждого каталога.

Затем проверьте, хорошо ли создано дерево каталогов, созданное вами в пункте назначения. И попробуйте переместить каждый файл по отдельности:

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

Я не могу сказать вам, насколько это опасно. Вы можете потерять данные! Я не уверен, что find будет делать, если он не может создать файл. Я надеюсь, что он просто испустит ошибку сообщения и продолжит движение. Но поскольку вы, по-видимому, пытаетесь восстановить данные из среды повреждения, вы, вероятно, знаете о любых рисках.

Если это работает по назначению, все, что останется в источнике, это каталоги и файлы, которые невозможно перенести. Если вы хотите, вы можете искать на SO, как рекурсивно удалять пустые каталоги (я на 100% уверен, что это было задано раньше), чтобы сделать ваш анализ проще.

Я предлагаю вам сделать небольшой тестовый пример на поврежденном носителе. mkdir несколько каталогов, touch некоторых случайных файлов и попробуйте эти шаги, чтобы узнать, что произойдет. Также, вероятно, хорошая идея, если вы сделаете это в одном каталоге за раз, а не в корне.


Я имею в виду, что, если ваш strucutre, например:

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

Затем запустите его 3 раза; один раз в dir1 , тогда, если все работает гладко, перейдите к dir2 и dir3 , вместо того чтобы делать все сразу . ,