特定のフォルダについて、その中の壊れたリンクをすべて削除するにはどうすればよいですか?
この答え 壊れたリンクを1つ削除する方法を示していますが、それを1行だけにまとめることはできません。これにワンライナーはありますか?
壊れたシンボリックは、もはや存在しないファイル/フォルダーを指すリンクです。
再帰なしで現在のディレクトリ内の壊れたシンボリックリンクをすべて削除する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)
を作成します。
リンクした回答に基づく単純な回答(特定のディレクトリ、$DIR
):
find -L $DIR -maxdepth 1 -type l -delete
man find
の例から:
find -L /usr/ports/packages -type l -exec rm -- {} +
/ usr/ports/packages内の壊れたシンボリックリンクをすべて削除します。
[〜#〜] 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
質問の質問に対する受け入れられた回答に基づく回答 「壊れたシンボリックリンクを見つけるにはどうすればよいですか」 :
find . -type l -! -exec test -e {} \; -print | xargs rm
パッケージ symlinks
は多くのディストリビューション(Ubuntu 16.04およびFedora 25を含む)にプリインストールされており、いくつかの本当に便利な機能があります。
symlinks -d ./
readlink
を使用して、シンボリックリンクが壊れているかどうかを判断できます。
以下は、指定されたディレクトリ(およびサブディレクトリ)内のすべての壊れたシンボリックリンクをリストします。
find . -type l -exec sh -c 'readlink -f "{}" 1>/dev/null || echo "{}"' -- "{}" \;
壊れたものを取り除くためにecho
をrm
に置き換えてください!
(混乱を避けるために、readlink
の出力を/dev/null
にリダイレクトしました。シンボリックリンクのターゲットをリストします。)
rmlint を使用して試すことができます。
最初に、壊れたシンボリックリンクを含むフォルダーにディレクトリを変更し、次に次のコマンドを実行して、nowhereを指す不良なシンボリックリンクを見つけます。
rmlint --types="badlinks"
その後、rmlint
は現在のディレクトリにbashスクリプトrmlint.sh
を作成し、ターミナルに不正なシンボリックリンクのリストを出力します。現在のディレクトリにあるすべての悪いシンボリックリンクを削除するには、次を実行します。
./rmlint.sh
ライナーは1つではありませんが、非常に使いやすいです。