999
我想删除名称中没有该字符串的文件。
我努力了:
grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --
但它们都不起作用。我使用的是 macOS Sierra,带有 bash:3.2.57。
答案1
在以下位置使用扩展的通配模式bash
:
rm ./!(*999*)
这需要shopt -s extglob
启用(并且为了安全起见,如果所有文件名都包含 ,则不会错误地删除shopt -s failglob
具有不寻常名称的文件)。该模式将匹配当前目录中的任何名称,除了那些匹配.!(*999*)
999
!(*999*)
*999*
同时删除隐藏文件(名称以点),启用该dotglob
选项shopt -s dotglob
。
只关心常规文件或常规文件的符号链接(而不是目录等):
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
与上述循环等效的shellzsh
是
rm ./(^(*999*))(.)
您的第一个命令将不起作用,因为grep
它将查看文件内部。它将删除所有不含行的文件999
(如果您添加了该--null
选项,则它可以与 一起使用xargs -0
)。
你的第二个命令将不起作用,因为grep
在 macOS 上不支持--null-data
(但是它有一个--null
选项,但仅适用于生成文件名输出时)。另请注意,它会查找999
文件中的任何位置路径名(即包括任何目录组件),而不仅仅是文件名。
答案2
只需反转名称条件find
:
find . -type f \! -name "*999*"
添加-delete
或-exec rm {} +
实际删除匹配的文件。