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


32

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

  • 目录build
  • 目录obj
  • * .so文件。

我写了一个命令

find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;

递归地遍历所有目录并删除我需要的所有内容。

为什么最后会有这样的输出?也许我应该写一个不同的命令。

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

在什么系统上?你应该总是用find这样find /search_directory optionsomiting搜索目录不是一个好主意
Kiwy

像这样自动删除是个坏主意。您可以有一个脚本给您应聘者,然后应查看该脚本以确保您没有删除对系统重要或必要的任何内容。您不清楚在哪里运行此程序。如果您只是在用户空间中执行此操作,那么我想它不会造成太大的伤害,但是您应该确保不要在系统区域中意外执行此操作。您绝对想以用户身份运行此类脚本。
Faheem Mitha 2014年

@ Kiwy,@ FaheemMitha,该命令将仅用于项目直接性;它不会对那里造成任何伤害。
Maksim Dmitriev

Answers:


54

-prune在仍然要删除的目录上使用,以告诉您find不要费心尝试在其中查找文件:

find . \( -name build -o -name obj -o -name '*.so' \) -prune -exec rm -rf {} +

还要注意,*.so需要用引号引起来,否则外壳可能会将其扩展到.so当前目录中的文件列表。

与您的GNU -regex类型一等效的是:

find . \( -name build -o -name obj -o -name '*?.so' \) -prune -exec rm -rf {} +

请注意,如果您要使用GNU特定语法,则最好使用-delete而不是-exec rm -rf {} +。使用-delete,GNU find-depth自动打开。它不运行外部命令,因此更有效,并且更安全,因为它消除了竞争状态,在某些情况下,有人可以通过将目录更改为符号链接来使您删除错误的文件find找到一个文件并将其rm删除(info -f find -n 'Security Considerations for find'有关详细信息,请参阅)。

find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+\.so)' -delete

-delete还可以更好地处理类似空间的问题
Izkata 2014年

@Izkata,并不比-exec rm -rf {} +那些都没有问题的要好。
斯特凡Chazelas

@StephaneChazelas-我很困惑{}-是否应该引用它们?它似乎没有引号就可以工作,但是在示例中使用了GNU Findutils手册'{}'。你能澄清一下吗?
grebneke 2014年

1
@grebneke,我认为某个地方的帖子声称很旧版本的可能需要引用引号csh,但我永远无法验证该声明。我所知道的任何现代外壳都不需要它们。POSIX绝对不需要它们。该POSIX的例子不使用它们。
斯特凡Chazelas

3
并且-delete不能与目录一起使用。
St0RM

8

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

find . -depth ...

您应该考虑将其-delete用于文件和-exec rmdir目录。


0

我的解决方案。

find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -prune -exec rm -rf {} +

+ vs \; 在-exec命令中


仅在删除目录内执行之间没有边界的情况下,这并不总是可行。
吉尔斯(Gilles)'所以

@Gilles,“处决之间的界限”是什么意思?
Maksim Dmitriev 2014年

1
-exec … {} +一次执行多个文件的命令,其大小取决于命令行上的大小。如果文件太多(或者更确切地说,如果路径的总长度太长),find将执行的多个实例rm,从而可能最终删除它正在遍历的目录。与with +相比,它的可能性更低;,但+不能解决问题。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.