由于工作效率低下,我必须在Linux机器和Windows机器之间复制目录。这些目录包含符号链接(在复制Linux> Windows> Linux之后)包含纯文本链接(例如foobar.C
包含文本../../../Foo/Bar/foobar.C
)
是否有一种有效的方法可以递归地从文件内容中重新创建符号链接以获得完整的目录?
我试过了:
find . | xargs ln -s ??A?? ??B?? && mv ??B?? ??A??
我真的不知道如何填充变量,但??A??
应该是文件中符号链接的目的地,??B??
应该是带有后缀的文件的名称{ {1}}附加。
答案 0 :(得分:1)
如果你确定所有文件都包含符号链接,那就不是很难了。
find . -print0 | xargs -r 0 sh -c '
for f; do ln -s "$(cat "$f")" "${f}_temp" && mv "${f}_temp" "$f"; done' _
_
伪参数是必要的,因为sh -c
的第二个参数用于填充子shell中的$0
。 shell本身是必需的,因为您无法直接将多个命令传递给xargs
。
-print0
和相应的xargs -0
是GNU扩展,可以正确处理棘手的文件名。有关详细信息,请参阅find
手册。
我可能会在继续进行符号链接之前添加一个简单的验证检查;例如,如果文件上的grep -cm2 .
返回2,则跳过该文件(它包含多行文本)。如果您可以更具体(例如,所有符号链接以../
开头),则更具体。