我试图删除重复的下载并犯了运行错误
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)"*