次のコマンドを使用します:
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
とは、実際にはGNUfind
を意味します。 ;)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
は行く方法です。そうしないと、一致する結果がありません。また、ls
のh
は'ここでは何の目的も果たしません。-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
それだけです
コメント
- これにより、指定されたパスの下のターゲットを指すすべてのシンボリックリンクがどのように削除されますか?質問は、他のディレクトリ内のターゲットを指す特定のディレクトリ内のシンボリックリンクを削除することについて尋ねていることに注意してください。