想咨询如何为多个文件编写符号链接?就像编写 bash 脚本一样
基本上该文件是gstreamer库,该库就是这样的模式。一个例子如下
libgstadaptivedemux-1.0.so should link to libgstadaptivedemux-1.0.so.0
libgstadaptivedemux-1.0.so.0 should link to libgstadaptivedemux-1.0.so.0.1806.0
libgstadaptivedemux-1.0.so.0.1404.0 (the old library)
libgstadaptivedemux-1.0.so.0.1806.0 (the new library)
我尝试做类似以下的事情
ln -sf libgst*.0 libgst*
ln -sf libgst*.0.1806.0 libgst*.0
但总是失败,说 libgst***.0.1806.0 不是目录。我哪里出错了?
谢谢
答案1
ln -sf libgst*.0 libgst*
扩展到(在你的情况下)
ln -sf libgstadaptivedemux-1.0.so.0 libgstadaptivedemux-1.0.so.0.1404.0 libgstadaptivedemux-1.0.so.0.1806.0 libgstadaptivedemux-1.0.so libgstadaptivedemux-1.0.so.0 libgstadaptivedemux-1.0.so.0.1404.0 libgstadaptivedemux-1.0.so.0.1806.0
因为libgst*.0
匹配libgstadaptivedemux-1.0.so.0
、libgstadaptivedemux-1.0.so.0.1404.0
和libgstadaptivedemux-1.0.so.0.1806.0
,而libgst*
匹配所有四个文件。
对于这样的多个参数,ln
预计最后一个参数是一个目录;这个变体的目的ln
,与n参数在哪里n> 2,是创建所有名称文件的链接(非选项参数1到n-1) 在给定目录中(参数n)。
假设你总是替换现有链接,从不创建新链接,您的第一个命令可以替换为
ln -sf libgst*.so.0 libgst*.so
(但如果这两个链接存在,则不需要该命令)。
你的第二个命令应该替换为
ldconfig
这将正确更新链接和库缓存(这是动态链接器真正使用的)。
答案2
请理解扩展的作用:它用所有匹配的现有文件名*
替换单词 ith the ,因此将变成*
ln -sf libgst*.0 libgst*
ln -sf libgstadaptivedemux-1.0.so.0.1404.0 libgstadaptivedemux-1.0.so.0.1806.0 libgstadaptivedemux-1.0.so.0.1404.0 libgstadaptivedemux-1.0.so.0.1806.0
´----------------------------------v----------------------------------´ `----------------------------------v----------------------------------´
matching libgst*.0 matching libgst*
在您的情况下,两个 glob 都扩展为相同的两个文件(或者另外扩展为已存在的匹配符号链接),因此您必须将文件名添加到命令中ln
。在这种情况下,ln
期望姓氏是一个目录,所有符号链接都应放置在其中。这就是您收到此错误消息的原因。
但您需要一些不同的东西:经典形式ln -s file symlink
,一次创建一个链接。如果您不想单独编写它,则需要循环,如果有类似的逻辑
for file in libgst*1806.0; do ln -sf "$file" "${file%.1806.0}; done