如何使用rm命令删除所有文件,但排除某些通配符?

使用rm *text*命令可以删除所有包含特定字符串的文件。我想知道如何使其删除除了具有特定通配符的文件之外的所有文件。
我尝试过使用其他方法,比如:
find . -type f -print0 | xargs --null grep -Z -L 'text' | xargs --null rm

或者

grep -r -L -Z 'text' . | xargs --null rm

但是这些方法都不起作用。相反,它们会删除给定目录中的所有文件。
我该怎么办?

1Bash扩展的globbing(extglob)提供了一个否定运算符-例如,请参见如何从特定文件夹中删除除一个命名文件之外的所有文件 - steeldriver
2就你的“查找”尝试而言,问题在于它们会对文件名进行grep操作,而不是匹配文件内容与“text”。 - steeldriver
2个回答

你可以通过启用扩展的通配符来实现这一点。
shopt -s extglob

现在你可以做的事情有很多。
ls !(*.pdf)

或者以你的例子来说
rm !(*text*)

使用find命令:
find . -type f -not -name "*text*" -exec rm {} \;

请注意,这将删除当前文件夹及其子文件夹中不匹配指定模式(*text*)的所有文件。
如果您只想删除当前文件夹中的文件,可以使用-maxdepth 1标志:
find . -maxdepth 1 -type f -not -name "*text*" -exec rm {} \;