我是一名研究生,可以访问我所在大学的 Linux 集群研究小组。多年来,我积累了很多目录——我猜“文件夹”是Windows/Mac的术语? -- 在我的主目录 ( ~
) 中。当我进行新的模拟时,我使用在主目录中创建一个新目录mkdir
,然后在该目录中运行模拟。
但随着时间的推移,我在我的主目录中积累了很多这样的目录。现在我想将一些目录移动到子目录中。例如,我可能想创建一个名为 的新目录simulations1_10
,然后将目录simulation1
, simulation2
, ...移动simulation10
到该目录中 - 以便我的主目录的根目录更有条理。
为此,我可以使用cp
.例如:
cp -r simulation1/ simulations1_10/
会将目录simulation1
(及其所有内容)复制到目录simulations1_10
。然后我就可以删除simulation1
.
但是,我的转账不是跨越文件系统边界,也是mv
如此很多比...快cp
。 (mv
当然也可以让我避免删除步骤。)例如:
mv simulation1/ simulations1_10/
快速完成这个技巧(与 不同的是cp
,mv
默认情况下是递归的)。根据这个答案到这个问题,mv
速度要快得多,因为它“只是更新各个目录中的 inode 数据库”。
我的问题是,使用有什么危险吗mv
?
我认为一个危险是,如果在传输过程中mv
被中断(由于电源故障、用户按Ctrl+C等),则文件可能会在源中损坏和目的地。它是否正确?
另外,如果我使用mv
很多,是否有可能“索引节点数据库”更新过于频繁,导致磁盘碎片或其他硬盘/文件系统问题?
答案1
函数rename
(命令的基础mv
,“mv 实用程序应执行与 rename() 函数等效的操作”) 是原子的(参见 POSIXhttp://pubs.opengroup.org/onlinepubs/009695399/functions/rename.html,指的是 C 标准):
对于常规文件,此 rename() 函数与 ISO C 标准定义的函数等效。此处的包含扩展了该定义,以包括对目录的操作,并指定新参数命名已存在的文件时的行为。该规范要求函数的操作是原子的。
(但请参阅以下警告:https://unix.stackexchange.com/a/322074/88983.)
无论是通过 Ctrl-C 还是其他方式中断的操作都不应导致文件部分传输。事实上,正如您所提到的,单文件系统mv
实际上并不复制任何文件内容,仅复制文件元数据。在这方面最糟糕的情况就是看到部分移动目录(如果您这样做mv a b c dest
,则可能会中断并且仅例如a
移动到dest
,但所有文件及其内容都将被正确移动),而不是部分移动的常规文件。
关于你的索引节点方面的问题,我想说这通常不是一个问题;更新索引节点以仅移动几个目录是一种低开销的例行操作(在同一文件系统上发生的文件内容写入应该是更大的潜在性能影响或碎片原因,具体取决于特定的文件系统类型)。