删除文件,但前提是它是符号链接

删除文件,但前提是它是符号链接

理想情况下我想要这样的命令

rm --only-if-symlink link-to-file

因为我已经多次不小心删除了文件而不是指向该文件的符号链接。当涉及 sudo 时,这可能尤其糟糕。现在我当然会做一个ls -al来确保它确实是一个符号链接等,但这很容易受到操作员错误(类似命名的文件、拼写错误等)和竞争条件(如果有人希望我出于某种原因删除文件)的影响。有没有一种方法可以检查文件是否是符号链接,并且仅在一个命令中删除它?

答案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真的非常危险。请务必将其放在查找命令的末尾。如果您放错了位置,无论结果是否符合您的条件,它都会删除找到的所有内容。

正如评论中所建议的,更安全的选择可能是结合使用findrm -i(这会强制您确认文件删除):

$ $ find . -type l -iname "foo" | xargs rm -i

就我个人而言,我习惯临时删除文件,因为我和你一样,过去也-exec trash {} \;被烧伤过。 rmDouble 去寻找放错地方的-delete旗帜。

http://slackermedia.ml/trashy

答案3

zsh -c 'rm foo(@)'

@是一个全局限定符;模式foo(@)匹配匹配的内容foo,但仅匹配符号链接。

foo(-@)只会匹配损坏的符号链接。foo(@,L0)只匹配符号链接和空文件。

当然,如果您首先运行 zsh,则只需输入rm foo(@)。您确实需要注意不要Enter在键入之前按(@)

相关内容