Shell

刪除源自特定目錄的符號連結

  • October 28, 2017

我有一個“install.sh”來安裝我的個人腳本:

find /home/Steven -name '*.sh' -exec ln -s -t /usr/local/bin {} +

我想製作一個“uninstall.sh”來刪除由“install.sh”創建的符號連結。我寫了這個:

for z in /usr/local/bin/*
do
 if [ -h "$z" ]
 then rm "$z"
 fi
done

但它會刪除所有符號連結,而不僅僅是目標位於“/home/Steven”下的符號連結。

如果你有 GNU 或 BSD find,應該這樣做:

find -lname '/home/Steven/*' -delete

您可以修改您的腳本並使用grepreadlink提取realpath所需子目錄中的文件,例如:

for z in /usr/local/bin/*
do
 if [ -h "${z}" ] && readlink -f "${z}" | grep -q '^/home/Steven'
     then rm "${z}"
 fi
done

readlink -f命令返回符號連結指向的文件的完整路徑。grep -q '^/home/Steven'如果路徑以子字元串 ‘/home/Steven’ 開頭,該命令返回 true,否則返回 false。

提醒一句:與符號連結相關的一些歧義可能會影響此處的結果。該命令將遞歸解析連結,因此如果目錄中的文件本身是該目錄之外的符號連結點readlink -f,則上述命令將失敗。/home/Steven如果這不是所需的行為,那麼您可能想要使用該realpath命令。

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