通过删除版本号创建符号链接

通过删除版本号创建符号链接

我有大量这样的共享库:

libexpat.so.1.6.7                        libqquicklayoutsplugin.so        libstdc++.so.6.0.24
libexportlib.so.1.0.0                    libqsvg.so                       libsystemd.so.0.19.0
libfontconfig.so.1.10.1                  libQt53DAnimation.so.5.11.3      libwidgetsplugin.so
libfreetype.so.6.16.0                    libQt53DCore.so.5.11.3           libwindowplugin.so
libgcc_s.so.1                            libQt53DExtras.so.5.11.3         libX11.so.6.3.0
libgcrypt.so.20.2.2                      libQt53DInput.so.5.11.3          libX11-xcb.so.1.0.0

我试图循环遍历所有共享库,并通过删除它们的版本号(如果它们有任何版本号)来创建符号链接。例如:

libgcrypt.so.20.2   -> libgcrypt.so.20.2.2
libgcrypt.so.20     -> libgcrypt.so.20.2.2
libgcrypt.so        -> libgcrypt.so.20.2.2

到目前为止,我已尝试使用以下命令查找具有版本号的所有共享库:

find . -name '*.so.*'

但我不知道如何使用awkln -s命令:

find . -name '*.so.*' -exec #awk and ln -s commands goes here# \;

有人能给我提示吗?

答案1

这似乎确实是其他东西的工作(ldconfig?),但是:

find . -name '*.so.*' -exec sh -c '
for so; do
  target="${so%.*}"
  while [ "${target##*.}" != "$target" ]; do
    echo ln -s "$so" "$target"
    target="${target%.*}"
  done
done' _ {} +

shell 命令循环遍历参数(文件名),并且对于每个文件名,去掉扩展名以获取链接目标(直到目标没有扩展名,在被.so去掉之后)。删除echo以实际建立链接。

相关内容