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

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

我正在使用 CentOS 5.5,想要移动大量文件夹同一卷内,保留他们的mtime

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

cp -p -r source/data target/
rm -rf source/data

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

嗯,那也没用。文件夹mtime恢复了,但我移动的文件夹中的所有文件夹(只有 1 级深度的文件夹)都重置了,mtime原因我不明白。

有人有合适、有效且正确的解决方案吗?

答案1

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

cp -p -r -l source/date target/
rm -rf source/data

由于实际上只复制目录和文件引用,因此速度会更快:

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

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

答案2

另一个解决方案可能是:

rsync -a --remove-source-files 源/数据 目标/

相关内容