我试图删除重复的下载并导致运行错误
rm -rf *(1)*
Run Code Online (Sandbox Code Playgroud)
这删除了所有内容~/Downloads而没有错误消息。
这个正则表达式到底有什么作用?
在 POSIX shell 中,括号保留用于(cmd1; cmd2; cmd3)
在子 shell 中生成内部命令。由于*(1)*括号中没有用换行符或分号将星号与星号分开,因此是语法错误。当然,即使*;(1);*没有意义,虽然本身不是语法错误。
在 Bash 中,如果extglob启用,可以通过shopt -p |& grep extglob“*(pattern-list)匹配给定模式的零次或多次出现”来验证。在这种情况下,*(1)*
总是扩展到目录中的所有文件,因为*(1)可以匹配模式的零次出现1并且*将匹配所有其他名称,无论它们是什么。结果是所有文件(和目录,也是文件)被删除。
另请注意,shell 使用 shell 模式(称为 globs),这与正则表达式不同。有关详细信息,请参阅Gilles 的回答。在您的情况下,要删除名称包含的每个文件(1),您需要转义或引用括号以保留其字面含义,即,
rm -rf *'(1)'*
rm -rf *\(1\)*
rm -rf *"(1)"*
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |