如何在 Linux 中 mv 文件夹保留其 mtime?

Rom*_*nka 12 linux timestamp mv

我正在使用 CentOS 5.5 并希望在一个卷中移动大量文件夹,保留它们的mtime.

我能找到的最佳解决方案是这样的:

cp -p -r source/data target/
rm -rf source/data
Run Code Online (Sandbox Code Playgroud)

NFS 共享上有超过 1TB 的数据,复制需要永远进行。我不想复制。我想要瞬间移动。

当我使用 移动文件夹时mv source/data target/mtime文件夹(不是文件)的 被设置为当前时间。这是因为此操作修改了我正在移动的文件夹的内容(该..条目指向不同的 inode)。

我想出了一个我调用的以下 shell 脚本mv_preserve_mtime.sh

#!/bin/bash
# Moves source folder to target folder. 
# You are responsible for making sure the target does not exist, otherwise this blows up
export timestamp=`stat -c %y $1`
mv "$1" "$2"
touch --date="${timestamp}" $2
Run Code Online (Sandbox Code Playgroud)

嗯,这也不起作用。该文件夹mtime已恢复,但我移动的文件夹中的所有文件夹(只有 1 级深的文件夹)mtime由于我不明白的原因而重置。

有没有人有适当,有效和正确的解决方案?

小智 16

POSIXmv没有提供任何选项来请求 atime/mtime 保留,但是由于操作是本地到同一卷,您可以要求cp使用硬链接而不是使用该-l选项复制常规文件的数据:

cp -p -r -l source/date target/
rm -rf source/data
Run Code Online (Sandbox Code Playgroud)

由于只有目录和文件引用会被实际复制,它应该会更快:

有关硬链接的更多信息,您可以查阅相应的维基百科页面

至于为什么用您当前的解决方案重置子目录 mtime ,那是因为您只获取和恢复父目录 mtime : touch 不是递归命令。