从文件内容创建符号链接

Create symlink from the contents of a file

由于工作流程效率低下,我不得不在 Linux 机器和 windows 机器之间复制目录。目录包含 symlinks,其中(在复制 Linux>Windows>Linux 后)包含明文形式的 link(例如 foobar.C 包含文字 ../../../Foo/Bar/foobar.C)

是否有有效的方法从文件内容递归地重新创建 symlinks 以获得完整目录?

我试过:

find . | xargs ln -s ??A?? ??B?? && mv ??B?? ??A??

我真的不知道如何填充变量,但是 ??A?? 应该是文件中 symlink 的目的地,??B?? 应该是文件的名称附加后缀 _temp 的文件。

如果您确定所有文件都包含符号链接,那不是很难。

find . -print0 | xargs -r 0 sh -c '
 for f; do ln -s "$(cat "$f")" "${f}_temp" && mv "${f}_temp" "$f"; done' _

_ 伪参数是必需的,因为 sh -c 的第二个参数用于填充子 shell 中的 [=13=]。 shell 本身是必需的,因为您不能直接将多个命令传递给 xargs.

-print0 和相应的 xargs -0 是一个 GNU 扩展,可以正确处理棘手的文件名。有关详细信息,请参阅 find 手册。

我可能会在继续符号链接之前添加一个简单的验证检查;例如,如果 grep -cm2 . 文件 returns 2,则跳过该文件(它包含多于一行的文本)。如果您可以更具体(例如,所有符号链接都以 ../ 开头),一定要更具体。