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

次のコマンドを使用します:

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/

コメント

  • ターゲットフォルダにリンクされているすべてのシンボリックリンクを削除するという意味ですか?または、見つかったすべてのシンボリックリンクを特定のフォルダに移動しますか?
  • @uther:リンクを削除することを意味します。

回答

必ず代替回答 。現時点ではそれほど高く投票されていませんが、それはさらに重要です。

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

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 

コメント

  • このコマンドはすべてのシンボリックリンクを削除しますか?上記の私の編集を参照してください。
  • @マルコ:はい、最初の3行はそうです。もっと編集します:)
  • iの最後に-printも追加しますv id = “0fdc8cc887″>

コマンドで視覚的なフィードバックを取得します。

回答

With -lnameをサポートする最新のfind

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

コメント

  • これは優れたシンプルなソリューションです。私はテストしました、そしてそれは魅力のように働きます。ありがとう
  • おそらくそれはfind /usr/local/bin
  • 必ずしも現代的ではないはずです。 GNU findは私が維持しているよりも長い間-lnameを持っていました(2003年頃から)。
  • @JamesYoungman:ありがとう!現代のfindとは、実際にはGNU findを意味します。 ;)usr/local/binを使用しました。これは、'がOPが使用したものだからです。

回答

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

見つけられなかった場合に備えて-lnameをサポートします。これは、シェルとreadlinkのみを使用する別の方法です。

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

回答

zshの場合:

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

$REPLY:Pはシンボリックリンクのないパスへのパスを完全に解決するため、/usr/local/texlive自体がシンボリックリンクのないパスであると想定します、シンボリックリンクの解決後に/usr/local/textliveの下にあるすべてのファイルが削除されます。これには、/usr/local/texlive/fooへのリンクだけでなくまたは/usr/./local/texlive/whateverまたは/some/other/symlinkへ。これ自体は/usr/local/texliveなど

回答

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

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

コメント

  • これらは、grepが検索しているusr/local/binのようなパスであるため、grep -Eは行く方法です。そうしないと、一致する結果がありません。また、lshは'ここでは何の目的も果たしません。 -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G)。詳細については、man lsまたはman grep

回答

sudo unlink /path/of/your/package

それだけです

コメント

  • これにより、指定されたパスの下のターゲットを指すすべてのシンボリックリンクがどのように削除されますか?質問は、他のディレクトリ内のターゲットを指す特定のディレクトリ内のシンボリックリンクを削除することについて尋ねていることに注意してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です