我想删除*.o目录及其子目录中的所有文件。但是,我收到一个错误:
sashoalm@aspire:~/.Workspace.OLD$ rm -r *.o
rm: cannot remove `*.o': No such file or directory
Run Code Online (Sandbox Code Playgroud)
另一方面,rm *.o有效,但它不是递归的。
Hau*_*ing 385
这是邪恶的:rm -r不是删除文件,而是删除目录。幸运的是,可能没有目录匹配*.o.
你想要什么是可能的zsh,但不与sh或bash(bash的新版本可以做到这一点,但只有当您启用了shell选项globstar用shopt -s globstar)。通配模式**/*.o不仅限于文件(也许zsh也有排除非文件的技巧)。
但这是为了find:
find . -type f -name '*.o' -delete
Run Code Online (Sandbox Code Playgroud)
或(因为我不确定是否-delete是 POSIX)
find . -type f -name '*.o' -exec rm {} +
Run Code Online (Sandbox Code Playgroud)
ter*_*don 71
这不是-rswitch 的rm工作原理:
-r, -R, --recursive
remove directories and their contents recursively
Run Code Online (Sandbox Code Playgroud)
rm没有文件搜索功能,它的-r开关不会使其下降到本地目录并识别与您提供的模式匹配的文件。相反,模式 ( *.o) 由 shell 展开,rm并将下降到并删除名称与该模式匹配的任何目录。如果您有一个名称以 结尾的目录.o,那么您尝试的命令会删除它,但它不会.o在子目录中找到文件。
您需要做的是使用find:
find . -name '*.o' -delete
Run Code Online (Sandbox Code Playgroud)
或者,对于非 GNU find:
find . -name '*.o' -exec rm -r {} \;
Run Code Online (Sandbox Code Playgroud)
或者,如果您正在使用,bash您可以启用globstar:
shopt -s globstar
rm -r -- **/*.o
Run Code Online (Sandbox Code Playgroud)
注意:所有三个选项都将删除名称以 结尾的目录.o,如果这不是您想要的,请使用以下选项之一:
find . -type f -name '*.o' -delete
find . -type f -name '*.o' -exec rm {} \;
rm -- **/*.o
Run Code Online (Sandbox Code Playgroud)