Answers:
在中使用扩展的球形模式bash
:
rm ./!(*999*)
这需要shopt -s extglob
启用(为了安全起见,也要启用shopt -s failglob
,以便!(*999*)
如果所有文件名都包含,则不会错误地删除具有异常名称的文件999
)。该模式!(*999*)
将匹配当前目录中的任何名称,但那些名称与匹配除外*999*
。要还删除隐藏的文件(名称以点开头的文件),请同时启用该dotglob
选项。
只关心普通文件或指向普通文件的符号链接(而不是目录等):
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
zsh
相当于上述循环的shell将是
rm ./(^(*999*))(.)
您的第一个命令将不起作用,因为grep
它将查看文件内部。它将删除所有没有行的文件999
(您已添加了--null
选项,使其可以使用xargs -0
)。
您的第二个命令将不起作用,因为grep
在macOS上不支持--null-data
(但是它有一个--null
选项,仅用于生成文件名输出时)。还要注意,它将查找999
文件路径中的任何位置(包括目录组件),而不仅仅是文件名。
failglob
选项,否则!(*999*)
如果没有其他名称不包含的文件,它最终可能会删除被调用的文件999
。
grep -l
使它列出-v
在内容(而不是文件名)中找到(或找不到)匹配项的文件。grep
始终与您指定文件的内容匹配,而不与它们的名称匹配。