web-dev-qa-db-ja.com

壊れたシンボリックリンクをすべて線で削除しますか?

特定のフォルダについて、その中の壊れたリンクをすべて削除するにはどうすればよいですか?

この答え 壊れたリンクを1つ削除する方法を示していますが、それを1行だけにまとめることはできません。これにワンライナーはありますか?

壊れたシンボリックは、もはや存在しないファイル/フォルダーを指すリンクです。

50
fotanus

再帰なしで現在のディレクトリ内の壊れたシンボリックリンクをすべて削除するPOSIXの方法を次に示します。シンボリックリンク(_-L_)を走査するようにfindに指示することにより機能しますが、すべてのディレクトリまたはシンボリックリンクへのリンクで(_-Prune_)を停止します。

_find -L . -name . -o -type d -Prune -o -type l -exec rm {} +
_

シェルループを使用することもできます。テスト_-L_はシンボリックリンクに一致し、_-e_は既存のファイルに一致します(壊れたシンボリックリンクを除く)。

_for x in * .[!.]* ..?*; do if [ -L "$x" ] && ! [ -e "$x" ]; then rm -- "$x"; fi; done
_

サブディレクトリに再帰する場合、この手法は機能しません。 GNU find(非組み込みLinuxおよびCygwinで見つかる))では、_-xtype_述語を使用して、壊れたシンボリックリンクを検出できます(_-xtype_はシンボリックリンクのターゲット、および破損したリンクのレポートl)。

_find -xtype l -delete
_

POSIXly、2つのツールを組み合わせる必要があります。 _find -type l -exec …_を使用して各シンボリックリンクでコマンドを呼び出し、_[ -e "$x" ]_を使用してそのリンクが破損していないかどうかをテストできます。

_find . -type l -exec sh -c 'for x; do [ -e "$x" ] || rm "$x"; done' _ {} +
_

最も簡単な解決策は、zshを使用することです。現在のディレクトリ内の壊れたシンボリックリンクをすべて削除するには:

_rm -- *(-@D)
_

括弧内の文字は glob qualifiers :_-_シンボリックリンクを逆参照するため、_@_はシンボリックリンクのみに一致する(_-@_の組み合わせは壊れたシンボリックリンクのみを意味する)、およびDは、ドットファイルに一致します。サブディレクトリに再帰するには、rm -- **/*(-@D)を作成します。

92
Gilles

リンクした回答に基づく単純な回答(特定のディレクトリ、$DIR):

find -L $DIR -maxdepth 1 -type l -delete
19
sanmiguel

man findの例から:

find -L /usr/ports/packages -type l -exec rm -- {} +

/ usr/ports/packages内の壊れたシンボリックリンクをすべて削除します。

6
Mr. Kennedy

[〜#〜] mac [〜#〜]の場合、次のようにドライランを実行します。

DIR=<some path>
find -L $DIR -maxdepth 1 -type l -print

これで、次のように古いシンボリックリンクを整理できます:

for f in `find -L $DIR -maxdepth 1 -type l`; do unlink $f; done
6
saurabheights

質問の質問に対する受け入れられた回答に基づく回答 「壊れたシンボリックリンクを見つけるにはどうすればよいですか」

find . -type l -! -exec test -e {} \; -print | xargs rm
5
rayphi

パッケージ symlinks は多くのディストリビューション(Ubuntu 16.04およびFedora 25を含む)にプリインストールされており、いくつかの本当に便利な機能があります。

symlinks -d ./
3
SamWN

readlinkを使用して、シンボリックリンクが壊れているかどうかを判断できます。

以下は、指定されたディレクトリ(およびサブディレクトリ)内のすべての壊れたシンボリックリンクをリストします。

find . -type l -exec sh -c 'readlink -f "{}" 1>/dev/null || echo "{}"' -- "{}" \;

壊れたものを取り除くためにechormに置き換えてください!

(混乱を避けるために、readlinkの出力を/dev/nullにリダイレクトしました。シンボリックリンクのターゲットをリストします。)

2
devnull

rmlint を使用して試すことができます。

最初に、壊れたシンボリックリンクを含むフォルダーにディレクトリを変更し、次に次のコマンドを実行して、nowhereを指す不良なシンボリックリンクを見つけます。

rmlint --types="badlinks"

その後、rmlintは現在のディレクトリにbashスクリプトrmlint.shを作成し、ターミナルに不正なシンボリックリンクのリストを出力します。現在のディレクトリにあるすべての悪いシンボリックリンクを削除するには、次を実行します。

./rmlint.sh

ライナーは1つではありませんが、非常に使いやすいです。

0
Erdos Yi