壊れたシンボリックリンクを一度に削除するには?

壊れたシンボリックリンクを一度に削除するには?

私は複数のログファイルへのシンボリックリンクを作成しました。ログファイルの構文はyyyymmdd.log.gz

簡単にするために、次のように解析するのではなく、単純なシーケンスを使用していますdate

for dd in $(seq -w 20150101 20151231) ; do 
     ln -s $origin/$dd.log.gz $target/$dd.log.gz
done

作成したばかりの壊れたシンボリックリンクを一度に削除するにはどうすればよいですか?

答え1

この簡単な一行の操作はすぐに行われます。この必要GNU検索ツール:

find . -xtype l -delete

いくつかの説明:

-xtype l切断されたリンクテスト(反対-type

-delete これ以上手間をかけずにファイルを直接削除しxargsたり、-exec

注:-xtype lは-xtypeを意味します。小文字エル(良い協会);)

答え2

find -L /path -type l -exec rm -i {} \;

を使用して-Lシンボリックfindリンクに沿ってテストを評価します-type。リンクに正常に従うと、そのリンクは次のようになります。いいえ壊れて-type lテストが間違っています(リンクが解決する内容について評価されるため)。リンクをたどることができない場合、リンクは切断され、テストは真に-type lなります。

-type lテストが成功すると、切断された-exec rm {} \;リンクが削除されます。

主にLinuxユーザーにはGNUismの使用を推奨し-xtype l、Solaris、FreeBSDなど、GNU以外のUNIXシステムには適していません。

答え3

With(実際にはコードで構文を使用しますzsh。withではこれらの変数を引用する必要があります):zshbash

rm -- $target/*(-@)

または:

rm -- $target/<20150101-20151231>.log.gz(-@)

*(@)一致ファイル形式シンボリックリンク*(-@)それでもタイプです。シンボリックリンクシンボリックリンクの確認後(つまり、シンボリックリンクの宛先を確認できない場合)、これはGNUfindと同じです-xtype l

zshGNUでは、lnループを次のように書くことをお勧めします。

ln -srt $target -- $origin/<20150101-20151231>.log.gz

相対パスを含めて相対シンボリックリンクを作成しても、$origin次の場合にシンボリックリンクが壊れる危険性が減ります。起源(そしてターゲット)は将来の名前が変更される予定です。

答え4

以下は、指定されたタイムスタンプで誤ったコマンドが原因ですべての壊れたリンクが生成された場合にうまく機能します。

ls -lrt | grep "Sep 17 15:06" | awk '{print $9}' | xargs \rm

関連情報