如何删除不以“.c”结尾的文件?

如何删除不以“.c”结尾的文件?

我有一个包含所有 C 程序的目录。我还在创建时编译了它们,以便检查我的代码。程序很多,有近100个。所以我想要一个 BASH 脚本来检查文件是否以“.c”结尾。如果是,那么它不会执行任何操作,如果不是,那么它将删除它们。假设我的文件名之一是“Hello.c”,那么我在编译时将其二进制文件命名为“Hello”。那么有人可以为我制作这个脚本吗?

答案1

您可以使用(第一次测试)-delete的标志find-ls

find -not -name "*.c" -delete

如果您不想使用find,而只想使用当前目录中的文件,您可以这样做

rm !(*.c)

确保bash设置shopt -s extglob了正确的通配符。此外,如果您设置了 globstar ( shopt -s globstar),则可以递归操作(对于bash4 以上的版本):

rm **/!(*.c)

答案2

find在这种情况下我总是更喜欢。您不必担心特殊文件名,并且可以处理不同的文件类型。如果您只想删除文件,则应该添加-type f到您的选项中。所以我最喜欢的解决方案是:

find -not -name "*.c" -type f -delete

不过要小心。测试这样的命令总是一个好主意。

答案3

激活 ksh 扩展通配符模式使用命令shopt -s extglob(您可以将其放入您的~/.bashrc)。然后该模式!(*.c)匹配当前目录中除匹配的文件之外的所有文件*.c

rm !(*.c)

这是非常危险的,因为它会删除.txt文件、.h文件等。一个不那么激烈的命令是

rm !(*.*) *.o

这仍然会删除READMEMakefile等。您也许应该只删除可执行文件:

find . -type d -prune -o -type f -perm -100 -exec rm {} +

更短,如果你find支持的话:

find . -maxdepth 1 -type f -perm -100 -delete

相关内容