理想情况下我想要这样的命令
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
真的非常危险。请务必将其放在查找命令的末尾。如果您放错了位置,无论结果是否符合您的条件,它都会删除找到的所有内容。
正如评论中所建议的,更安全的选择可能是结合使用find
和rm -i
(这会强制您确认文件删除):
$ $ find . -type l -iname "foo" | xargs rm -i
就我个人而言,我习惯临时删除文件,因为我和你一样,过去也-exec trash {} \;
被烧伤过。 rm
Double 去寻找放错地方的-delete
旗帜。
答案3
zsh -c 'rm foo(@)'
@
是一个全局限定符;模式foo(@)
匹配匹配的内容foo
,但仅匹配符号链接。
foo(-@)
只会匹配损坏的符号链接。foo(@,L0)
只匹配符号链接和空文件。
当然,如果您首先运行 zsh,则只需输入rm foo(@)
。您确实需要注意不要Enter在键入之前按(@)
。