我正在使用 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 源/数据 目标/