最好的方法来复制所有文件,而忽略错误?


36

我有一个部分损坏的HD,无法通过Disk Utility修复,但可以只读方式安装,从而可以访问其上的数据。

我正在尝试将所有可恢复的内容复制到备用HD上,但是遇到错误时,我尝试的每种方法都会失败-剩余的文件无法复制。

Finder-失败。SuperDuper-失败。同上(终端命令)-失败。

我希望Ditto能够解决问题,Ditto手册页说:

如果复制了所有内容,同上将返回0,否则返回非零。同上几乎永不放弃,宁愿沿途报告错误。诊断消息将被打印为标准错误。

我已将错误提交给Apple ditto,但未能如广告所示那样执行。

还有其他想法吗?


请参阅stackoverflow.com/a/27637277,而不是--ignore-errors下面的答案。
spyle

Answers:


28

cp -Rfv sourcefile destinationfile经常成功地使用。

cp =复制

R =维护文件层次结构

f =如果无法打开现有目标文件,请将其删除并重试

v =详细模式,显示进行过程中传输的文件

sourcefile =您要复制的数据

destinationfile =您要复制到的目录/驱动器


3
这如何忽略源驱动器上的错误(请参阅问题)?
nohillside

1
@patrix不会“忽略”错误,但是“ f”标志会强制通过它们,仅复制完整的数据。当您查看进度时(由于冗长的标志),当遇到不良数据时,将看到“由于I / O错误而未复制数据”行的输出。一旦显示错误,它将直接进入下一个文件,而无需任何用户输入。海报的场景听起来与我使用此命令从flakey磁盘/卷中检索数据的数十次极为相似。
兔子先生

有没有一种方法可以复制带有某些后缀的失败文件,以便更好地找到所有丢失的文件?

1
从BSD cp手册(macOS):“在-R模式下,即使检测到错误,cp也将继续复制。”
马特

非常感谢。我目前正尽全力从发生故障的HDD中进行修复,尽管我并不关心损坏的数据,但我不会浪费时间去修复它,而只是删除它。这是一种快速实现此目标的方法。我将错误传递到日志文件中,稍后可以通过附加以下内容来分析该错误文件以删除具有读取错误的截断的文件:2> error.log
0x01

23

尝试使用Gnu ddrescue-这是一个数据恢复程序,该程序在复制操作期间执行基于块的复制,但数据恢复已损坏。如果使用的是Homebrew,则可以通过在“终端”窗口中输入以下内容来获取OS X :

brew install ddrescue

关于arstechnica指南介绍了如何使用ddrescue抢救发生故障的磁盘。确保您通读了指南,因为其中包含有用的信息。这是如何到达那里的要点。

  • 使用找到驱动器diskutil list。标识符列是您要查找的内容:

    /dev/disk1
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      GUID_partition_scheme                        *750.2 GB   disk1
       1:                        EFI EFI                     209.7 MB   disk1s1
       2:                  Apple_HFS Macintosh HD 2          80.0 GB    disk1s2
       3:                  Apple_HFS Home                    509.1 GB   disk1s3
    
  • 卸载有问题的磁盘:

    diskutil unmount /dev/disk1s3    
    
  • 开始将磁盘恢复为映像的操作。确保将的位置Rescue.dmg替换为所需的位置。

    sudo /usr/local/bin/ddrescue -v -n -c 4096 /dev/disk1s3 Rescue.dmg Rescue.log
    
  • 将映像恢复到驱动器上:

    sudo /usr/local/bin/ddrescue --force -v -c 4096 Rescue.dmg /dev/disk2s0 recovery.log
    

建议您还阅读ddrescue手册,通过运行来学习可用的选项man ddrescue


1
要添加到主持人通知中:这可能是对问题的很好回答,但需要更多工作。您可以为OS X设备添加一些示例ddrescue命令吗?我已经用我们希望在此处的答案中看到的背景和信息进行了一些修复。如果您这样做,我相信这将是一个很好的回应。
伊恩·C

我在一两年前成功使用ddrescue从坏磁盘上复制了数据。它克服了大约200个错误,最终设法读取了其中的一半。生成的复制磁盘被送入diskwarrior,结果可能损坏了大约100万个文件中的10个文件。
匹兹堡迈克

7

我喜欢使用rsync以便将文件从损坏的源复制到功能目标:

rsync -auv --delete --ignore-errors /path/to/source/ /path/to/destination/

哪里:

-a =“归档模式” =递归到目录,将符号链接复制为符号链接,保留权限,时间,组和特殊文件,还保留所有者(当所有者= root时)和设备(当所有者= root时)

-u= 如果目标中对应的副本较新,则跳过源中的文件

-v =详细输出

--delete= 源中不存在的目标文件将被删除

--ignore-errors =在复制过程中发生I / O错误时删除文件/目录


4

Macworld提示建议使用dd进行逐位复制(忽略错误),然后在Finder中装入结果图像以恢复文件。我没有尝试过,但听起来可能可行。


这很好,因为如果该磁盘为Duff,则希望快速关闭数据。这样,您将获得一个用于块复制的块(包括错误),您可以在闲暇时检查该块,而不必担心磁盘会永久失效,然后再取出所有磁盘。我将执行一个操作,从头到尾都完美完成,而不会跳过文件碎片到文件碎片的整个位置,这将在创建DD副本的驱动器上更加困难。
塞特

3
ddrescue比DD在这个更好的,因为它会重试坏的部分超过了,只要你把它运行-看到这个以前的回答,其中OP神他的数据掉了几个星期的研磨后(!)。请注意,如果HD硬件出现故障,这是一个好方法,但是根本无法解决卷结构损坏的问题-只是随文件一起复制。
Gordon Davisson

3

您可能会考虑使用该dd命令从损坏的硬盘到新硬盘执行逐块复制。

假设新硬盘(/dev/disk2)的大小等于或大于损坏的硬盘(/dev/disk1)的大小,则可以发出:

dd if=/dev/disk1 of=/dev/disk2 bs=4096 conv=notrunc,noerror

大小为4k的块,不要截断任何数据块,忽略所有错误

要查找设备名称,mount请先从终端运行。


0

ditto命令应该有效,我将ditto-vverbose选项一起使用,以便您可以准确地看到导致复制内容错误的内容。


3
据质问者ditto行不通。您为什么认为呢?
nohillside

op正在询问替代方法ditto
juniorRubyist

0

您可能会尝试运行SuperDuper并忽略带有io错误的文件(如果只有少数几个文件),并且您使用了智能更新功能,这是一种有效的方式来删除大部分数据。(我认为如果可以的话,最好使用dd命令)。

脚步:

  1. 选择“备份所有文件”作为备份策略
  2. 在选项中选择“智能更新”(否则,如果您遇到一个或两个以上的错误,此过程将花费很长的时间,为此您将需要付费版本)
  3. 运行副本
  4. 当复制失败时,请阅读日志以查找哪个文件无法复制,然后单击确定/关闭以返回到“开始”屏幕
  5. 从“使用”下拉列表中选择“编辑所选副本脚本”
  6. 在脚本命令下,添加无法复制的文件,将其添加到文件列表后应说“忽略”
  7. 用某些名称保存脚本(例如,忽略损坏的文件)
  8. 选择您的脚本,并根据需要重复步骤3-7多次,以忽略所有损坏的文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.