理想的には、このようなコマンドが欲しい
rm --only-if-symlink link-to-file
誤ってファイルを何度も削除しましたが、そのファイルを指すシンボリックリンクは削除しなかったためです。 sudoが関連している場合、これは特に悪い可能性があります。もちろん、私はls -al
本当にシンボリックリンクであることを確認するために1つを行います。ただし、これはオペレータエラー(名前付きファイル、スペルエラーなど)や競合状態(誰かが何らかの理由でファイルを削除したい場合)に脆弱です。 。ファイルがシンボリックリンクであることを確認し、1つのコマンドで削除する方法はありますか?
答え1
$ rm_if_link(){ [ ! -L "$1" ] || rm -v "$1"; }
#test
$ touch nonlink; ln -s link
$ rm_if_link nonlink
$ rm_if_link link
removed 'link'
答え2
find
テスト条件が利用可能です-type l
(発見されたオブジェクト私インクがあるかどうか)
foo
たとえば、現在のディレクトリにファイルがある場合は、次のようにできます。
$ find . -type l -iname "foo" -delete
次の方法で簡素化できます。
$ find . -maxdepth 1 -type l -delete
現在のディレクトリのすべてのシンボリックリンクが削除されます。
警告する:
この-delete
オプションはfind
本当に危険です。必ず find コマンドの最後に入れてください。場所を誤って指定すると、結果が条件に一致するかどうかに関係なく、見つかったすべての項目が削除されます。
コメントで提案されているようにとfind
の組み合わせを使用する方が安全なオプションかもしれませんrm -i
(ファイルの削除を確認する必要があります)。
$ $ find . -type l -iname "foo" | xargs rm -i
-exec trash {} \;
個人的に私もあなたのように過去にやけどをしたので一時的にファイルを削除するのに慣れています。rm
ダブルは間違った旗を見つけに行きます-delete
。
答え3
zsh -c 'rm foo(@)'
@
はグローバル予選;パターンはfoo(@)
一致するものと一致しますfoo
が、シンボリックリンクのみが一致します。
foo(-@)
壊れたシンボリックリンクのみが一致します。foo(@,L0)
シンボリックリンクと空のファイルのみが一致します。
もちろん、zshを最初に実行する場合rm foo(@)
。Enter入力する前に押さないように注意してください(@)
。