我一直在 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-*
提前创建文件的评论是正确的。除此之外,在代码中使用gtouch
in 代替似乎可行,所以也许这个示例会有所帮助: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 .