我有一个磁盘,上面有很多表面错误,直到几天前我拿到了新的 ssd,我才开始使用它。我想知道如何才能完全复制我的主分区,同时忽略所有错误,因为它一开始可能有几百个坏簇,而且在 gparted 上单击“忽略”实际上需要几个小时。拜托,我有 85gb 的空间,重新创建或手动复制所有文件并更正权限绝对是一件痛苦的事。
答案1
A. 将文件复制到“平面”目录中
如果脚本至少可以创建一个文件列表,但它应该忽略复制它们时可能出现的问题,那么它应该可以工作。
如果有重复,它会将重复项保存为duplicate_1_<filename>
,duplicate_2_` 等。
我用了:
try
<copy_command>
except Exception
pass
它涵盖了最广泛的错误范围。
剧本:
#!/usr/bin/env python3
import shutil
import os
sourcedir = "/path/to/source"
dest_dir = "/path/to/destination"
for root, dirs, files in os.walk(sourcedir):
for name in files:
subject = root+"/"+name
n = 1; name_orig = name
while os.path.exists(dest_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig
n = n+1
try:
newfile = dest_dir+"/"+name
shutil.copy(subject, newfile)
except Exception:
pass
将其复制到一个空文件中,另存为giveit_ashot.py
并设置源目录和目标。
运行方式:
python3 /path/to/giveit_ashot.py
B. 如果目录结构很重要
然后使用下面的脚本,它首先尝试(重新)创建目录(自上而下),然后尽可能将文件复制到结构中。再次强调:至少必须能够创建文件/目录列表。
#!/usr/bin/env python3
import shutil
import os
sourcedir = "/path/to/source"
dest_dir = "/path/to/destination"
dirdata = []
filedata = []
for root, dirs, files in os.walk(sourcedir):
for dir in dirs:
absolute = root+"/"+dir
relative = absolute.replace(sourcedir, "")
dirdata.append([absolute, dest_dir+relative, len(absolute.split("/"))])
for file in files:
abs_file = root+"/"+file
rel_file = abs_file.replace(sourcedir, "") # source
filedata.append((abs_file, dest_dir+rel_file)) # destination
dirdata.sort(key=lambda x: x[2])
for item in dirdata:
try:
if not os.path.exists(item[1]):
os.mkdir(item[1])
except Exception:
pass
for item in filedata:
try:
shutil.copy(item[0], item[1])
except Exception:
pass
答案2
gparted
建议您创建/格式化分区。我想不是您家里的那个分区。
如果分区已经创建,请尝试使用以下命令进行格式化:
mkfs.ext4 -c /dev/sdXX
确保放置正确/dev/sdXX
。
如果您尝试从坏分区复制到好分区,我不知道cp
在出现 IO 错误时会如何表现。
答案3
你必须采取不同的措施
- 修复坏块 (某些文件系统,如 ext4 和 ext3 允许这样做,详细信息请参阅
man e2fsck
) - 复制忽略错误(您的初始问题),例如
rsync -a --ignore-errors /path/to/mountpoint/of/broken/device/ /path/to/folder/on/working/device/
长远的评论:您可能希望在覆盖它或扔掉磁盘之前创建分区的映像dd
(新的恢复工具可能会在某个时间出现并从磁盘中获取比当前更多的数据,并且您获得的恢复文件的提示(包括我的)可能是错误的),例如sudo dd if=/dev/sdxY | pigz -p 8 | sudo tee /path/to/a/file/on/a/working/disk.img.gz
对压缩图像执行此操作。