rm -rf *(1)* 有什么作用?

rm -rf *(1)* 有什么作用?

我试图删除重复的下载并犯了运行错误

rm -rf *(1)*

这删除了所有内容,~/Downloads并且没有错误消息。

这个正则表达式到底有什么作用?

答案1

在 POSIX shell 中,保留括号用于(cmd1; cmd2; cmd3) 在子 shell 中生成内部命令。由于*(1)*括号中的星号没有用换行符或分号分隔,因此这是一个语法错误。当然,even*;(1);*没有意义,尽管本身不是语法错误。

在 Bash 中,如果extglob已启用,可以通过以下方式验证shopt -p |& grep extglob,“*(pattern-list)匹配零次或多次出现的给定模式”。在这种情况下,*(1)* 总是扩展到全部目录中的文件,因为*(1)可以匹配零出现的模式1,并且*将匹配所有其他名称,无论它们是什么。结果是所有文件(和目录,也是文件)都被删除。

另请注意,shell 使用 shell 模式(称为 glob),这与正则表达式不同。看吉尔斯的回答更详细的说明。在您的情况下,要删除名称包含的每个文件(1),您需要转义或引用括号以保留其字面含义,即

rm -rf *'(1)'*
rm -rf *\(1\)*
rm -rf *"(1)"*

相关内容