将目录移动到另一个驱动器时,如果过程中出现错误,则不会删除任何内容。我收到此类错误:
mv: cannot stat ‘originaldirectory/longpath/irrelevantfile’: Input/output error
我想mv
:
- 重试几次(可能就是这么简单,可能什么也解决不了)
- 删除已成功移动的文件
这样只有有问题的文件保留在原始文件夹中。
答案1
有比这更好的工具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
答案2
首先,在目标中重建源的目录树:
cd source
find -type d -exec mkdir -p destination/{} \;
{}
中的应该find
包含每个目录的相对路径。
然后,检查您在目标中创建的目录树是否正常。并尝试单独移动每个文件:
cd source
find -type f -exec mv {} destination/{} \;
我无法告诉你这有多么潜在的危险。您可能会丢失数据!我不确定如果无法创建文件find
该怎么办。stat
我的希望是它只会发出一条消息错误并继续。但由于您显然是在尝试从损坏的介质中恢复数据,因此您可能意识到了任何风险。
如果这按预期工作,则源中留下的只是无法移动的目录和文件。如果需要,您可以搜索如何递归地删除空目录(我100%确定之前已经问过这个问题)以使您的分析更容易。
我建议你在损坏的介质中做一个小测试用例。mkdir
一些目录,touch
一些随机文件,然后尝试这些步骤看看会发生什么。如果您一次在一个目录中执行此操作而不是在根目录中执行此操作,这也可能是一个好主意。
我的意思是,如果你的结构是,例如:
.
├── dir1
│ ├── fileA
│ └── subdir1
│ └── fileB
├── dir2
│ └── fileC
└── dir3
├── subdir1
│ └── fileD
└── subdir2
└── fileE
然后运行3次;一旦进入dir1
,那么如果一切顺利,则移至dir2
、 和dir3
,而不是立即执行所有操作.
。