我想将我们服务器上的文件夹 (测试) 从 移动/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
均应采取以下步骤:[…]
该
mv
实用程序应执行相当于rename()
功能的操作[…][…]
如果成功,
mv
则不对当前执行任何操作source_file
,并继续执行任何剩余的s。如果由于[ ] […]source_file
中所述原因以外的任何原因而失败,则应将诊断消息写入标准错误,不对当前执行任何操作,并继续执行任何剩余的s。errno
EXDEV
mv
source_file
source_file
这基本上意味着mv
尝试rename
第source_file
一个。在单个文件系统中,这(通常,但并不总是)例子)) 有效,然后mv
不需要再做任何事情。EXDEV
意味着这行不通然后mv
尝试不同的方法。在你的情况下,旧目录和(部分)新目录仍然存在,这意味着rename
你EXDEV
尝试mv
了不同的方法。不同方法的要点如下:
[…]
根植于的文件层次结构
source_file
应被复制为根植于目标路径的文件层次结构。[…][…]
如果文件层次结构的复制由于任何原因失败,
mv
则应将诊断消息写入标准错误,不对当前执行任何操作source_file
,并继续处理任何剩余的source_file
操作。如果文件特征的复制由于任何原因失败,
mv
则应向标准错误写入诊断消息,但此失败不应导致mv
修改其退出状态。
因此mv
其作用类似于cp -Rp
。如果复制数据(但不是特征、元数据)存在任何问题,则不会继续进行下一步,即:
- 根植于的文件层次结构
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
,而且它在某种程度上起作用了,然后由于权限问题而停止,则您已部分移动文件和目录。
在这种情况下,哪些被移动了,哪些没有被移动?很难说清楚。如果发生这种情况,您应该查看目标目录的内容,看看是否可以手动将它们移回源目录。