我刚刚将一个 49GB 的目录“mv”到一个错误的文件路径,是否可以恢复文件的原始状态?

我刚刚将一个 49GB 的目录“mv”到一个错误的文件路径,是否可以恢复文件的原始状态?

我有(嗯,我) 目录:

/media/admin/my_data

它大约有 49GB 大小,里面有数万个文件。该目录是活动 LUKS 分区的挂载点。

我想将目录重命名为:

/media/admin/my_data_on_60GB_partition

我当时没有意识到,但我从主目录发出了命令,所以我最终做了:

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

然后mv程序开始将/media/admin/my_data其内容移动到新目录~/my_data_on_60GB_partition

我使用Ctrl+C来取消命令,所以现在我有一大堆文件分成不同的目录:

~/my_data_on_60GB_partition    <---  about 2GB worth files in here

/media/admin/my_data           <---- about 47GB of orig files in here    

新目录~/my_data_on_60GB_partition及其一些子目录归 root 所有。
我假设mv程序必须首先以 root 身份复制文件,然后在传输后将chown它们返回到我的用户帐户。

我有一个有点旧的目录/分区备份。
我的问题是,是否可以可靠地恢复被移动的一堆文件?

也就是说,我可以运行:

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data

或者我应该放弃尝试恢复,因为文件可能已损坏且部分完整等?

  • 操作系统 - Ubuntu 16.04
mv --version  
mv (GNU coreutils) 8.25

答案1

在文件系统之间移动文件时,mv在完成复制之前不会删除文件,并且它会按顺序处理文件(我最初说它会依次复制然后删除每个文件,但这并不能保证 - 至少 GNUmv复制然后删除每个文件)命令行参数依次,并且POSIX 指定了此行为)。因此,目标目录中最多应有一个不完整的文件,而原始文件仍将位于源目录中。

要将内容移回,请添加标志-i,这样mv就不会覆盖任何内容:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(假设您没有任何隐藏文件可以从中恢复~/my_data_on_60GB_partition/),或者更好(鉴于您发现,您可能有许多文件等待删除),添加该-n标志,这样mv就不会覆盖任何内容,但不会问你一下:

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

您还可以添加-v标志来查看正在执行的操作。

对于任何符合 POSIX 标准的mv,原始目录结构应该仍然完好无损,因此您也可以检查这一点 - 并简单地删除/media/admin/my_data...(但在一般情况下,我认为该mv -n变体是安全的方法 - 它处理所有形式的mv,包括例如 mv /media/admin/my_data/* my_data_on_60GB_partition/.)

您可能需要恢复一些权限;你可以这么做全体使用chown和,或使用和chmod从备份中恢复它们getfaclsetfacl(感谢佐藤桂为了提醒)。

答案2

在得到 Stephen Kitt 的回答并讨论此命令作为潜在的解决方案后:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

我决定推迟运行它,直到我明白发生了什么,这个答案描述了我发现并最终做了什么。

我使用 Gnumv将文件复制到目标,然后仅当复制操作成功时,它才会删除原始文件。
但是我想确认是否mv一次执行一个文件这个序列,如果是这样,原始文件夹内容将被干净地切成两部分,一部分转移到目的地,另一部分仍然留在源处。并且可能会有一个文件在复制过程中被中断,该文件在两个目录之间是常见的 - 并且它可能格式错误。

为了发现两个目录之间共有的文件,我运行了:

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

这个结果表明源目录和目标目录中都有 14,237 个相同文件的实例,我通过手动检查文件确认了这一点 - 是的,两个目录中都有许多相同的文件。这表明只有在mv复制大量文件后,它才会执行源文件的删除。快速查找infoonmv命令显示

它[ mv]首先使用一些与复制所请求的目录和文件相同的代码cp -a,然后(假设复制成功)删除原始文件。如果复制失败,则复制到目标分区的部分将被删除。

我没有运行该命令,但我怀疑我是否尝试运行

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

-i 覆盖前提示可能会触发超过 14,000 次。

然后查看新创建的目录中总共有多少个文件:

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

因此,如果新目录中总共有 14238 个常规文件,并且 14237 个文件在源中具有相同的原始文件,则意味着新目录中只有一个文件在源中没有相应的相同文件。为了找出该文件是什么,我按照源方向运行了 rsync:

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

快速检查确认这是格式错误的文件,该文件在源和目标上都存在,目标文件=64MB,原始文件=100MB。该文件及其目录层次结构仍归 root 所有,并且尚未恢复原始权限。

总结来说:

  • 所有从未到达的文件 mv仍然回到原来的位置(显然)
  • 所有完全复制的文件mv在源目录中仍然有其原始副本
  • 仅部分复制的文件仍将原始文件保留在源目录中

换句话说,所有原始文件仍然完好无损,这种情况下的解决方案就是简单地删除新目录!

答案3

我只是想我要评论一下,有些人可能会忍不住将“xargs”混入其中以并行运行。这让我很兴奋,我真的很喜欢上面的 rsync 解决方案。

至于有关移动和复制的文件系统内容以及原始文件何时被删除,VFS 和底层文件系统会在执行删除步骤之前进行协调以保证每个文件的原子性。因此,即使在目标文件完全写入之前被中断,VFS 中的所有锁定都是非常严格的,并且即使在并行情况下也能防止随机数据交错等问题。 (我研究过 Linux VFS 和 NFS4 的东西)

在混合中添加“xargs”可能会使双重健全性检查步骤变得令人头痛,因为多个文件正在传输中。我希望我有更多的系统级脚本。对我来说很好的提醒!

喜欢这个问题,对蜘蛛网有好处,让我再次喜欢 rsync。干杯!

相关内容