我有一个包含所有 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
),则可以递归操作(对于bash
4 以上的版本):
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
这仍然会删除README
、Makefile
等。您也许应该只删除可执行文件:
find . -type d -prune -o -type f -perm -100 -exec rm {} +
更短,如果你find
支持的话:
find . -maxdepth 1 -type f -perm -100 -delete