Mak*_*iev 41 find recursive rm
我需要删除所有编译的数据:
build
,obj
,我写了一个命令
find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)
递归遍历所有目录并删除我需要的所有内容。
为什么我最后会有这样的输出?也许我应该写一个不同的命令。
find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 73
-prune
在您无论如何要删除的目录上使用,以告诉find
不要费心尝试在其中查找文件:
find . \( -name build -o -name obj -o -name '*.so' \) -prune -exec rm -rf {} +
Run Code Online (Sandbox Code Playgroud)
另请注意,*.so
需要引用,否则shell可能会将其扩展.so
为当前目录中的文件列表。
相当于您的 GNU-regex
类型的将是:
find . \( -name build -o -name obj -o -name '*?.so' \) -prune -exec rm -rf {} +
Run Code Online (Sandbox Code Playgroud)
请注意,如果你要使用GNU特定的语法,你还不如用-delete
代替-exec rm -rf {} +
。使用-delete
,GNUfind
会-depth
自动打开。它不以这种方式运行外部命令,因此效率更高,而且更安全,因为它消除了竞争条件,在这种情况下,有人可能会通过将目录更改为符号链接来让您删除错误的文件。find
找到一个文件并将其rm
删除(info -f find -n 'Security Considerations for find'
有关详细信息,请参见)。
find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+\.so)' -delete
Run Code Online (Sandbox Code Playgroud)
Hau*_*ing 11
我想原因是find
首先删除目录树并尝试检查目录内容,这显然不是最佳顺序。您可以先强制find
检查内容:
find . -depth ...
Run Code Online (Sandbox Code Playgroud)
您应该考虑使用-delete
for 文件和-exec rmdir
目录。
归档时间: |
|
查看次数: |
24805 次 |
最近记录: |