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

the*_*fog 60 administration data-recovery files mv

我有(好吧,我)一个目录:

/media/admin/my_data
Run Code Online (Sandbox Code Playgroud)

它的大小约为 49GB,其中包含数万个文件。该目录是活动 LUKS 分区的挂载点。

我想将目录重命名为:

/media/admin/my_data_on_60GB_partition
Run Code Online (Sandbox Code Playgroud)

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

~% sudo mv /media/admin/my_data my_data_on_60GB_partition
Run Code Online (Sandbox Code Playgroud)

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

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

~/my_data_on_60GB_partition    <---  about 2GB worth files in here
Run Code Online (Sandbox Code Playgroud)

/media/admin/my_data           <---- about 47GB of orig files in here    
Run Code Online (Sandbox Code Playgroud)

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

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

也就是说,我可以运行:

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data
Run Code Online (Sandbox Code Playgroud)

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

  • 操作系统 - Ubuntu 16.04
/media/admin/my_data
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 89

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

要将内容移回,请添加-i标志,以免mv覆盖任何内容:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/
Run Code Online (Sandbox Code Playgroud)

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

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/
Run Code Online (Sandbox Code Playgroud)

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

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

您可能需要恢复一些权限;你可以这样做集体使用chownchmod,或使用备份恢复它们getfaclsetfacl(感谢佐藤桂提醒)。

  • 可以肯定的是,当发生 OP 所描述的事情时,我会改用 `rsync`,因此它还会检查所有文件的完整性。但很高兴知道我不需要那个。 (6认同)
  • 我会`su command mv -i ...`(或`su /bin/mv -i ...`),而不是`sudo mv -i ...` ),以防某些(奇怪的)管理员做了“mv”一个在系统级别*执行“mv -f”的函数(即 /etc/profile 或此类系统范围的文件)...命令某事:启动命令某事,而不是该命令的函数或别名一样的名字。(例如:一个人可能(非常!)不走运,并且在一个始终有来源的文件中有一个(非常、非常糟糕!)`function mv { /bin/mv -f -- "$@" }`,然后“rm -i something”不会问任何问题(只是抗议“-i”文件不存在!)...... [我见过这样的事情...... *颤抖*] (5认同)
  • @OlivierDulac - 一个完美的例子,说明为什么使用与标准程序同名的别名或脚本是不好的做法。 (3认同)

the*_*fog 20

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

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/
Run Code Online (Sandbox Code Playgroud)

我决定推迟运行它,直到我弄清楚发生了什么,这个答案描述了我发现并最终做的事情。

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

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

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237
Run Code Online (Sandbox Code Playgroud)

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

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

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

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/
Run Code Online (Sandbox Code Playgroud)

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

然后找出新创建的目录中的总文件数:

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238
Run Code Online (Sandbox Code Playgroud)

因此,如果新目录中共有 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)
Run Code Online (Sandbox Code Playgroud)

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

所以总结一下:

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

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