web-dev-qa-db-ja.com

特別なターゲットを持つすべてのシンボリックリンクを削除するにはどうすればよいですか?

コマンドで:

ls -la *

すべてのシンボリックリンクを一覧表示できます。

特別なフォルダにリンクされているすべてのシンボリックリンクを削除するにはどうすればよいですか?

例えば:

私のディレクトリusr/local/binには、次のエントリがあります。

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded
lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex
lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara

次に、パス/usr/local/texlive/のすべてのリンクを削除します

46
Marco Daniel

別の答えを必ずお読みください。この時点ではそれほど多くは投票されていませんが、それはさらに重要です。

これを使用して、すべてのシンボリックリンクを削除できます。

find -type l -delete

最新のfindバージョン。

古い検索バージョンでは、次のようにする必要があります。

find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;

特定のリンクターゲットに制限するには、どのパスにも改行文字が含まれていないと想定します。

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink '$lnkname')" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done

またはうまくフォーマットされた

 find -type l |
 while IFS= read -r lnkname;
 do
   if [ "$(readlink '$lnkname')" = "/your/exact/path" ];
   then
     rm -- "$lnkname"
   fi
 done

もちろん、ifには、パターンをgrepと照合するなど、より複雑な条件を含めることもできます。


あなたのケースに合わせて:

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q '^/usr/local/texlive/'); then rm "$lnk"; fi; done

またはうまくフォーマットされた:

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done
67
0xC0000022L

-lnameをサポートする最新のfindの場合:

find /usr/local/bin -lname '/usr/local/texlive/*' -delete

それを行う必要があります。

findソリューションは素晴らしいです。

検索結果が-lnameをサポートしていない場合に備えて、シェルとreadlinkのみを使用する別の方法を次に示します。

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done
5
Mikel

あなたのパスに行き、あなた自身のパス構成を設定してください

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf
0
wallance