web-dev-qa-db-ja.com

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

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

物事を簡単にするために、dateで解析せずに単純なシーケンスを使用します。

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

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

9
runlevel0

このシンプルな1ライナーは非常に高速で作業を行い、GNU findが必要です:

find . -xtype l -delete

少し説明:

-xtype lは、壊れているリンクをテストします(-typeの反対です)

-deleteは、ファイルを直接削除します。xargsまたは-execをさらに使用する必要はありません。

注:-xtype lは、-xtype小文字[〜#〜] l [〜#〜]link)のように;)

GNU Findutils:Find

21
runlevel0

zshを使用する(実際にはコードでzsh構文を使用しています。bashを使用する場合は、これらの変数を引用符で囲む必要があります):

_rm -- $target/*(-@)
_

または:

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

*(@)は、タイプsymlinkのファイルに一致します。 *(-@)は、シンボリックリンク解決後もタイプsymlinkであるもの(つまり、シンボリックリンクのターゲットを解決できないもの)です。これは、GNU findの_-xtype l_と同等です。

zshとGNU lnを使用すると、ループを次のように記述します。

_ln -srt $target -- $Origin/<20150101-20151231>.log.gz
_

これは、_$Origin_に相対パスが含まれている場合でも機能します(そしてOriginの一部のパスコンポーネント(と共通のパスコンポーネント) target)の名前は将来的に変更されます)。

1