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


43

コマンドを使って:

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/


1
ターゲットフォルダーにリンクされているすべてのシンボリックリンクを削除しますか?または、見つかったすべてのシンボリックリンクを特定のフォルダーに移動しますか?
ジョージM

@uther:リンクを削除するということです。
マルコダニエル

回答:


63

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

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

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

このコマンドはすべてのシンボリックリンクを削除しますか?...上記の私の編集を参照してください
マルコ・ダニエル

@Marco:はい、最初の3行がそうです。さらに編集:)
0xC0000022L

また-printfindコマンドの最後にを追加して、視覚的なフィードバックを取得します。
runlevel0

30

findをサポートするモダンで-lname

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

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


1
それは素晴らしいシンプルなソリューションです。私はテストし、それは魅力のように機能します。ありがとう
マルコダニエル

おそらくそれはfind /usr/local/bin
ジェームズヤングマン

1
必ずしも現代的ではありません。GNU find-lname、私がそれを維持していたよりも長い間(2003年頃から)持っていました。
ジェームズヤングマン

@JamesYoungman:ありがとう!現代では、find本当にGNUを意味していましたfind。;)usr/local/binOPが使用したものだからです。
クリストファーハンマルストロム

5

find解決策は素晴らしいです。

findがサポートしていない場合に備えて、-lnameシェルとのみを使用する別の方法がありreadlinkます。

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

1

zsh

rm -f /usr/local/bin(@e'{[[ $REPLY:P = /usr/local/texlive/* ]]}')

$REPLY:P完全に、シンボリックリンクフリー1へのパスを解決すると仮定して/usr/local/texlive、それ自体シンボリックリンク自由ですが、それは、シンボリックリンク解決後にライブの下のすべてのファイル削除します/usr/local/textliveへのリンク含まれる/usr/local/texlive/fooだけでなく、へ../texlive/barたりする/usr/./local/texlive/whateverかに/some/other/symlinkいるが、中にシンボリックリンクポインティング自身である/usr/local/texlive、など。


0

パスに移動し、パス構成を設定します

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

これらはusr/local/binそのようなパスでgrepあるため、を検索grep -Eする方法です。それ以外の場合、一致する結果はありません。またhlsここでは何の目的も果たしません!-h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G)。詳細については、man lsまたはman grep
ss_iwe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.