首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“查找-type d -exec rmdir {} \;”命令会生成“没有这样的文件或目录消息”

问为什么“查找-type d -exec rmdir {} \;”命令会生成“没有这样的文件或目录消息”
EN

Unix & Linux用户
提问于 2019-05-31 15:02:17
回答 2查看 1.3K关注 0票数 1

出于测试目的,我创建了以下目录。

代码语言:javascript
复制
user@linux:~$ mkdir dir0{1..3}

user@linux:~$ ls -l
total 12K
drwxr-xr-x 2 user user 4.0K Mei  31 10:45 dir01
drwxr-xr-x 2 user user 4.0K Mei  31 10:45 dir02
drwxr-xr-x 2 user user 4.0K Mei  31 10:45 dir03
user@linux:~$ 

然后,我用find -exec删除了它

代码语言:javascript
复制
user@linux:~$ find -type d -exec rmdir {} \;
rmdir: failed to remove '.': Invalid argument
find: ‘./dir02’: No such file or directory
find: ‘./dir01’: No such file or directory
find: ‘./dir03’: No such file or directory
user@linux:~$ 

目录被删除了,我核实了。

代码语言:javascript
复制
user@linux:~$ ls -l
total 0
user@linux:~$ 

我的问题是:

( 1)我不明白为什么信息会在那里。知道为什么吗?

代码语言:javascript
复制
rmdir: failed to remove '.': Invalid argument
find: ‘./dir02’: No such file or directory

我不认为rmdir会出现这样的错误

代码语言:javascript
复制
user@linux:~$ mkdir dir0{1..3}
user@linux:~$ 

user@linux:~$ ls -l
total 12K
drwxr-xr-x 2 user user 4.0K Mei  31 22:58 dir01
drwxr-xr-x 2 user user 4.0K Mei  31 22:58 dir02
drwxr-xr-x 2 user user 4.0K Mei  31 22:58 dir03
user@linux:~$ 

user@linux:~$ rmdir *
user@linux:~$ 

user@linux:~$ ls -l
total 0
user@linux:~$ 

( 2)是否有可能删除这些信息?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-05-31 15:18:33

可能发生的情况是,使用-exec ... \;构造,find将逐步完成它的工作:

  • 遍历目录树,找到与-type d匹配的条目,
  • 一旦找到这些条目,就立即对它们运行rmdir。

这意味着,在您的示例中,find将查看dir01,将其记为稍后要输入的目录,然后在其上运行rmdir,然后在尝试恢复到dir01时失败,因为它不再存在。

在这种情况下,使用-exec rmdir {} +运行应该会有所帮助:将发出对rmdir dir01 dir02 dir03的单个调用。这将消除最后三条错误消息。

关于.的错误消息是因为,.,当前目录确实是一个目录,但是rmdir不能删除它,因为它不是空的。使用-min-depth停止考虑它,使命令:

代码语言:javascript
复制
find -mindepth 1 -type d -exec rmdir {} +

这并不完美;嵌套目录或大量匹配的目录仍然会导致错误消息的打印,但这应该适用于问题中的简单情况。

票数 1
EN

Unix & Linux用户

发布于 2019-05-31 16:38:46

您可以从find获得那些“没有这样的文件或目录”错误,因为find正在尝试输入它刚刚删除的目录。默认情况下,它将将其操作应用于当前正在访问的目录中的所有匹配内容,然后再继续进入子目录。

将-depth添加到find调用中,使find对其搜索路径执行深度优先搜索,这意味着如果您在目录上执行rmdir,它将已经访问过它,不会再次尝试访问它。

由于这个原因,在使用-depth时隐含了-delete选项(在有-delete的find的实现中)。

代码语言:javascript
复制
find . -depth -type d -exec rmdir {} \;

-depth是find实用程序的标准选项。

注意,rmdir只在空目录上工作。如果你有很多非空目录,上面的命令会产生很多错误信息。

相反,如果您的find支持它,请使用-empty:

代码语言:javascript
复制
find . -type d -empty -delete

这将删除空目录。

对于没有非标准-delete或-emtpy的D18:

代码语言:javascript
复制
find . -depth -type d -exec sh -c '
    for dirpath do
        set -- "$dirpath"/*
        [ ! -e "$1" ] && rmdir "$dirpath"
    done' sh {} +

这将测试找到的目录是否为空,如果是,它们将被删除。

这是一段很长的代码,以避免由于目录是非空的而看到一些错误消息,但是产生的任何错误消息都有希望更有趣,因为它们可能是“拒绝权限”错误。在顶部的第一个/dev/null命令中将错误重定向到find,就会隐藏这些错误。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/522173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档