按名称删除文件和目录。无此文件或目录

Mak*_*iev 41 find recursive rm

我需要删除所有编译的数据:

  • 名为build,
  • 名为obj,
  • *.so 文件。

我写了一个命令

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)

  • 并且`-delete` 不能用于目录。 (3认同)

Hau*_*ing 11

我想原因是find首先删除目录树并尝试检查目录内容,这显然不是最佳顺序。您可以先强制find检查内容:

find . -depth ...
Run Code Online (Sandbox Code Playgroud)

您应该考虑使用-deletefor 文件和-exec rmdir目录。