プライベートスクリプトをインストールするための "install.sh"があります。
find /home/Steven -name '*.sh' -exec ln -s -t /usr/local/bin {} +
「install.sh」によって生成されたシンボリックリンクを削除する「uninstall.sh」を作成したいと思います。私はこれを書いた:
for z in /usr/local/bin/*
do
if [ -h "$z" ]
then rm "$z"
fi
done
ただし、ターゲットが「/home/Steven」の下にあるシンボリックリンクだけでなく、すべてのシンボリックリンクも削除されます。
答え1
GNUまたはBSDがある場合は、find
次のようにします。
find -lname '/home/Steven/*' -delete
答え2
スクリプトを変更するか、grep
またはを使用して目的のサブディレクトリにファイルを抽出できます。たとえば、次のようになりますreadlink
。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
。
答え3
リンクが相対的である可能性がある場合に対処し、その標準パスが内側にあることを確認するには、次の手順を実行します/home/Steven
。zsh
rm /usr/local/bin/*(@e{'[[ $REPLY:A = /home/Steven/* ]]'})
どこ:
@
シンボリックリンクに一致するGlob修飾子:e{code}
コード($REPLY
確認するファイルへのパスを含む)と一致するglob修飾子を評価します。$REPLY:A
絶対パスに展開されます$REPLY
。