删除名称中没有字符串的文件

删除名称中没有字符串的文件

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 {} +实际删除匹配的文件。

相关内容