我想删除目录及其子目录中的所有* .o文件。但是,我得到一个错误:

sashoalm@aspire:~/.Workspace.OLD$ rm -r *.o
rm: cannot remove `*.o': No such file or directory


另一方面,rm *.o可以工作,但是它不是递归的。

评论

“重复”用于删除与模式匹配的目录,而不是此问题中的文件!

@Futal不,不是。答案的标题不匹配,但是其可接受的解决方案通过全局模式删除文件。

@roaima在meta.stackoverflow.com/questions/292329/…中,对相同的解决方案是否意味着精确重复进行了一些讨论。我不知道哪一方是“官方”立场。

查找命令的有用位-“查找:路径必须在表达式之前:”如何指定也可在当前目录中查找文件的递归搜索?

#1 楼

那是邪恶的:rm -r不是用于删除文件,而是用于删除目录。幸运的是,可能没有与*.o匹配的目录。

zsh可以实现所需的功能,而shbash则不可以(新版本的bash可以做到这一点,但前提是您启用了globstar的shell选项shopt -s globstar )。迁移模式为**/*.o,但也不限于文件(也许zsh也具有排除非文件的技巧)。

但这对于find而言:

find . -type f -name '*.o' -delete


或(因为我不确定-delete是否为POSIX)

find . -type f -name '*.o' -exec rm {} +


评论


您能否在这种情况下解释花括号和加号?

–奥布里·罗伯逊(Aubrey Robertson)
16年8月18日在16:53

在macOS上正常工作

–致Kra
16年11月22日在9:36

@AubreyRobertson请参见手册页进行查找。 -exec +(与-exec相反)可一次处理多个文件。 {}是文件名/路径的占位符(在两种情况下)。

– Hauke Laging
17年1月2日,0:34

您还应该在{}周围加上双引号,例如:find。 -type f -name'* .o'-exec rm“ {}” +

– stpoa
17年9月28日在13:10

@stpoa我鼓励您尝试找到一个示例,其中我的代码无法正常工作。

– Hauke Laging
17年9月28日在18:01

#2 楼

这不是-rrm开关的工作方式:

   -r, -R, --recursive
          remove directories and their contents recursively


rm没有文件搜索功能,其-r开关不会使其降级到本地目录并识别与文件匹配的文件您提供的模式。相反,模式(*.o)由外壳扩展,并且rm将下降到并删除名称与该模式匹配的所有目录。如果您有一个名称以.o结尾的目录,那么您尝试的命令将删除它,但在子目录中找不到.o文件。

您需要使用find

find . -name '*.o' -delete


,或者,对于非GNU find

find . -name '*.o' -exec rm -r {} \;


或者,如果您使用的是bash,可以启用globstar

shopt -s globstar
rm -r -- **/*.o



注意:这三个选项也会删除名称以.o结尾的目录,如果这不是您想要的,请使用一个其中:

find . -type f -name '*.o' -delete
find . -type f -name '*.o' -exec rm {} \;
rm -- **/*.o