如何删除当前目录中与给定模式不匹配的某些文件?

iva*_*ras 2 unix shell terminal command-line

使用rm *.sh以删除.SH结尾的文件是很容易理解的.但是我如何删除当前目录中没有以.jar 类似结尾的所有文件rm * -except *.jar

thk*_*ala 6

试试这个:

find . -mindepth 1 -maxdepth 1 ! -name '*.jar' | sort
Run Code Online (Sandbox Code Playgroud)

如果你真的想要删除其输出中的所有文件,那么就这样做

find . -mindepth 1 -maxdepth 1 ! -name '*.jar' -delete
Run Code Online (Sandbox Code Playgroud)

您可以阅读find(1)手册页,了解有关这个功能强大的工具的更多信息.

编辑:

由于-delete标志只能在GNU find> 4.2.3中找到(正如SiegeX所指出的),这里有几个替代方案,它们也确保我们不会尝试删除目录:

find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -print0 | xargs -0 -r rm -f
Run Code Online (Sandbox Code Playgroud)

-r xargs标志是一个GNU扩展,所以这稍微更便携(它适用于*BSD),但不是很干净:

find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -print0 | xargs -0 rm -f
Run Code Online (Sandbox Code Playgroud)

作为最后 - 但最便携 - 度假胜地:

find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -exec rm '{}' ';'
Run Code Online (Sandbox Code Playgroud)

这具有为每个文件单独调用rm的缺点,这使得它明显变慢.