ファイルを削除します。ただし、シンボリックリンクの場合にのみ該当します。

ファイルを削除します。ただし、シンボリックリンクの場合にのみ該当します。

理想的には、このようなコマンドが欲しい

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

http://slackermedia.ml/trashy

答え3

zsh -c 'rm foo(@)'

@グローバル予選;パターンはfoo(@)一致するものと一致しますfooが、シンボリックリンクのみが一致します。

foo(-@)壊れたシンボリックリンクのみが一致します。foo(@,L0)シンボリックリンクと空のファイルのみが一致します。

もちろん、zshを最初に実行する場合rm foo(@)Enter入力する前に押さないように注意してください(@)

関連情報