当使用“mv”时,如果由于权限问题导致进程停止,如何检查移动了什么?

当使用“mv”时,如果由于权限问题导致进程停止,如何检查移动了什么?

我想将我们服务器上的文件夹 (测试) 从 移动/home/data/home/projects/data。我所做的是使用mv

由于一些权限问题,它最终没有移动该文件夹。但是,该文件夹仍然在数据中创建,其中没有文件。当我du -sh在该空文件夹上运行它时,它显示 21MB。

为什么它不为零?

我担心某些内容仍会从该测试文件夹中移动,因为我最终需要移动所有文件测试,并且不想丢失任何东西。

如果今天源测试文件夹没有发生任何改变,那么可以断定没有移动任何内容,这样正确吗?

ls -la显示.profile.ssh.vnc以及.config树上文件夹的链接。这是否意味着这些只是“隐藏文件”,并且这就是非零大小的来源?

答案1

mv工作原理

以下是摘录自POSIX 规范mv以及我的评论。

概要

mv [-if] source_file target_file
mv [-if] source_file... target_dir

您可能使用了非 POSIX 选项;无关紧要。我在这里引用概要是因为后面的引用提到了source_file,知道它们到底是什么意思是很好的。注意目录也是文件

[…]

对于每项工作source_file均应采取以下步骤:

[…]

  1. mv实用程序应执行相当于rename()功能的操作[…]

    […]

    如果成功,mv则不对当前执行任何操作source_file,并继续执行任何剩余的s。如果由于[ ] […]source_file中所述原因以外的任何原因而失败,则应将诊断消息写入标准错误,不对当前执行任何操作,并继续执行任何剩余的s。errnoEXDEVmvsource_filesource_file

这基本上意味着mv尝试renamesource_file一个。在单个文件系统中,这(通常,但并不总是)例子)) 有效,然后mv不需要再做任何事情。EXDEV意味着这行不通然后mv尝试不同的方法。在你的情况下,旧目录和(部分)新目录仍然存在,这意味着renameEXDEV尝试mv了不同的方法。不同方法的要点如下:

[…]

  1. 根植于的文件层次结构source_file应被复制为根植于目标路径的文件层次结构。[…]

    […]

    如果文件层次结构的复制由于任何原因失败,mv则应将诊断消息写入标准错误,不对当前执行任何操作source_file,并继续处理任何剩余的source_file操作。

    如果文件特征的复制由于任何原因失败,mv则应向标准错误写入诊断消息,但此失败不应导致mv修改其退出状态。

因此mv其作用类似于cp -Rp。如果复制数据(但不是特征、元数据)存在任何问题,则不会继续进行下一步,即:

  1. 根植于的文件层次结构source_file将被删除。

因此之后成功地cp至少对数据执行部分操作,在继续下一步(如果有)之前,mv就像rm -r对当前操作一样。source_file

结论是:如果您mv遵循 POSIX 规范(例如 GNUmv基本上应该如此)并且如果您指定了一个source_file(看起来是这样)并且如果错误阻止了任何数据被复制(看起来是这样)那么您尝试移动的所有内容都应该保持在源位置完好无损。

但请注意以下的注意事项。


注意事项

  • 如果您观察到的错误来自步骤 7(而不是步骤 6),则源位置可能完整也可能不完整。例如,假设您mv不被允许删除任何内容;或者可能不被允许从中删除相关目录/home/data 删除所有内容后来自目录本身。遗憾的是,您没有告诉我们您观察到的确切错误。请注意,步骤 7 中的任何错误都意味着步骤 6 已经成功复制了数据(如果没有,则将跳过步骤 7)。如果目标显然缺少一些文件,则错误可能来自步骤 6,并且首先没有尝试删除源位置。

  • 就你的问题而言,

    mv foo /destination/
    

    mv foo/* /destination/foo/
    

    在前一个命令中,只有一个source_file,步骤 6 最多执行一次,步骤 7 最多执行一次。如果foo未在 中复制,destination则不会删除任何内容。在后一个命令中,foo/*shell 可能会将 扩展为多个source_file,并mv分别处理每个命令;因此,如果步骤 6 失败,这将抑制步骤 7,那么它将抑制步骤 7source_file仅适用于当前处理

    不幸的是,您没有告诉我们您使用的确切命令。您写道“文件夹仍被创建”,我将其解释为“由mv”创建。这两个命令中的后者需要/destination/foo/事先存在,所以我断定您的命令不是这样的,这个警告与您的特定情况无关。


您的明确问题

如何检查使用时移动了什么mv以及进程由于权限问题而停止?

一般来说:通过仔细检查目标位置中的内容以及源位置中缺少的内容。如果源位置最初为空,则更容易。如上所述,如果您指定了一个,source_file并且错误来自复制阶段(步骤 6),而不是来自删除阶段(步骤 7),那么您可能不需要检查任何内容,源是完整的。

如果今天源测试文件夹没有发生任何改变,那么可以断定没有移动任何内容,这样正确吗?

一般来说,这取决于您所说的“源测试文件夹今天没有更改”是什么意思。如果您仅根据mtime这个单个目录或/和其中的直接文件来判断,那么重要的事实是mtime不会从文件传播到其父目录甚至更远。如果目录树深处的文件发生变化,那么除非您深入检查,否则您不会知道。

不过,就你的情况而言,你可能不需要检查任何东西,源是完整的。如果你不确定,请查看如何获取目录的“递归”上次修改日期。从目录中删除文件会改变mtime目录,因此这是检查是否mv删除了任何内容的正确方法。

为什么 [ 的输出du -sh] 不为零?

因为目录中有文件。ls -la证实了这一点。

ls -la显示.profile.ssh.vnc以及.config树上文件夹的链接。这是否意味着这些只是“隐藏文件”,并且这就是非零大小的来源?

是的。请使用du -ah来确认这一点。

答案2

“如果今天源测试文件夹没有发生任何改变,那么可以断定没有移动任何内容,这样正确吗?”

这是正确的结论。如果源文件夹没有被触碰,那么就没有移动任何内容。

唯一的风险是如果你跑了mv,而且它在某种程度上起作用了,然后由于权限问题而停止,则您已部分移动文件和目录。

在这种情况下,哪些被移动了,哪些没有被移动?很难说清楚。如果发生这种情况,您应该查看目标目录的内容,看看是否可以手动将它们移回源目录。

相关内容