Shell-Script

通過刪除版本號創建符號連結

  • December 15, 2018

我有大量這樣的共享庫:

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# \;

任何人都可以給我一個提示嗎?

這似乎真的是其他事情的工作(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以實際建立連結。

引用自:https://unix.stackexchange.com/questions/488097