特定のディレクトリから始まるシンボリックリンクの削除

特定のディレクトリから始まるシンボリックリンクの削除

プライベートスクリプトをインストールするための "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またはを使用して目的のサブディレクトリにファイルを抽出できます。たとえば、次のようになりますreadlinkrealpath

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/Stevenzsh

rm /usr/local/bin/*(@e{'[[ $REPLY:A = /home/Steven/* ]]'})

どこ:

  • @シンボリックリンクに一致するGlob修飾子:
  • e{code}コード($REPLY確認するファイルへのパスを含む)と一致するglob修飾子を評価します。
  • $REPLY:A絶対パスに展開されます$REPLY

関連情報