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


12

我正在使用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由于我不明白的原因而被重置。

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


我不知道为什么您尝试失败touch。是更改子目录的mtime 的mv步骤还是touch步骤?NFS服务器上使用什么操作系统,以及(如果知道)什么文件系统类型?
吉尔斯(Gillles)“所以-别再邪恶了”

@吉尔斯:我不知道为什么会这样。这是mv引起麻烦的步骤。NFS服务器实际上是NetApp存储,我对其内部几乎一无所知。
Roman Zenka 2010年

1
谢谢。我怀疑这是NetApp的怪胎。否则touch应该工作了。顺便说一句,更便携touch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp
吉尔(Gilles)“所以,别再邪恶了”

@吉尔斯:非常有趣,没意识到stat不是可移植的。
罗曼·曾卡(Roman

Answers:


15

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

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

由于只复制目录和文件引用,因此它应该快得多:

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

至于为什么使用当前解决方案重置子目录mtime,这是因为仅获取并还原了父目录mtime:touch不是递归命令。


mtime比这更复杂。仅父目录及其直接下的目录已更改mtime。所有其他目录保持不变。人们会希望更改每个目录,或者仅更改父目录。
Roman Zenka 2010年

1
实际上,这是有道理的:1)父目录具有良好的mtime,因为它是通过touch显式设置的; 2)使用父目录重新创建目录条目,但未手动还原其mtime(Unix目录结构和inode格式) 3)其余的树结构实际上没有更改,因为我们保持在同一卷上:这就是为什么mv没有“递归”选项的原因,只有在需要实际复制(例如,不同的卷)的情况下,才可以进入子目录。
尤里卡2010年

@Eureka:很好的解释,但是为什么要这样做呢?如果我是执行mv上的目录data,我只想改变..data的内容,修改sourcetarget目录正确列出移动的项目。无需触摸其他目录。
罗曼·曾卡(Roman Zenka)2010年

1
@Roman Zenka经过一番搜索,此行为似乎在Unices和文件系统之间相当松散地指定,并且依赖rename于内核和所使用的文件系统的许多底层syscall实现,NFS将其份额添加到问题中。有一些指针指出了这种不一致性:patchwork.ozlabs.org/patch/25833bugs.opensolaris.org/bugdatabase/…–
Eureka

@Eureka:我很难相信我认为如此基本的东西会变得一团糟。快到2011年了。感谢您提供的这些资源!
罗曼·曾卡(Roman Zenka)2010年

4

另一个解决方案可能是:

rsync -a-删除源文件源/数据目标/


这似乎在macOS上不起作用。
Lenar Hoyt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.