复制/保留符号链接时间戳

复制/保留符号链接时间戳

我一直在 GNU/Linux 系统上从事一些项目,现在它们已经存档在 FreeBSD 服务器上。在存档中,我重新排列了一些目录,现在我注意到一些符号链接已损坏:它们指向我的开发笔记本电脑上存在但存档中不存在的路径。因此,我希望这些链接指向目标目录已存档的新位置。我想保持文件、目录和符号链接的所有时间戳不变。

我的计划如下:

步骤1

使用 touch 复制符号链接和包含目录的时间戳:

$ touch -r . /tmp/timestamp-folder
$ touch -h -r ./symlink /tmp/timestamp-symlink

第2步

删除并使用正确的路径重新创建符号链接:

$ rm symlink
$ ln -s <correct-path> symlink

步骤3

恢复时间戳:

$ touch -h -r /tmp/timestamp-symlink symlink
$ touch -r /tmp/timestamp-folder .

不幸的是,这不起作用。首先,touch如果目标不存在,则拒绝读取符号链接的时间戳:

$ touch -h -r symlink /tmp/timestamp-symlink
touch: symlink: No such file or directory

所以我尝试创建丢失的路径(目录),以便触摸可以读取符号链接。这次touch运行没有错误,但创建的文件/tmp/timestamp-symlink具有符号链接指向的目录的时间戳,而不是符号链接本身的时间戳。

有没有一种方法可以用来touch读取与符号链接关联的时间戳并将它们设置在另一个文件上,就像普通文件和目录一样?如果没有,是否可以使用其他工具来实现这一目标?

答案1

在 FreeBSD 上,GNU 版本touch位于sysutils/coreutils软件包中。

$ sudo pkg install sysutils/coreutils

安装该软件包后,您应该gtouch/usr/local/bin.PATH如果该目录尚不存在,请将其添加到您的目录中。

$ ls -l $(which gtouch)
-r-xr-xr-x  1 root  wheel  133144 Apr  6 18:19 /usr/local/bin/gtouch

我的测试表明您关于/tmp/timestamp-*提前创建文件的评论是正确的。除此之外,在代码中使用gtouchin 代替似乎可行,所以也许这个示例会有所帮助:touch

gtouch /tmp/timestamp-folder /tmp/timestamp-symlink

gtouch -r . /tmp/timestamp-folder
gtouch -h -r ./symlink /tmp/timestamp-symlink

# Remove and recreate the symbolic link with the correct path:

rm symlink
ln -s <correct-path> symlink

# Restore timestamps:

gtouch -h -r /tmp/timestamp-symlink symlink
gtouch -r /tmp/timestamp-folder .

相关内容