出于测试目的,我创建了以下目录。
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删除了它
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:~$ 目录被删除了,我核实了。
user@linux:~$ ls -l
total 0
user@linux:~$ 我的问题是:
( 1)我不明白为什么信息会在那里。知道为什么吗?
rmdir: failed to remove '.': Invalid argument
find: ‘./dir02’: No such file or directory我不认为rmdir会出现这样的错误
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)是否有可能删除这些信息?
发布于 2019-05-31 15:18:33
可能发生的情况是,使用-exec ... \;构造,find将逐步完成它的工作:
-type d匹配的条目,rmdir。这意味着,在您的示例中,find将查看dir01,将其记为稍后要输入的目录,然后在其上运行rmdir,然后在尝试恢复到dir01时失败,因为它不再存在。
在这种情况下,使用-exec rmdir {} +运行应该会有所帮助:将发出对rmdir dir01 dir02 dir03的单个调用。这将消除最后三条错误消息。
关于.的错误消息是因为,.,当前目录确实是一个目录,但是rmdir不能删除它,因为它不是空的。使用-min-depth停止考虑它,使命令:
find -mindepth 1 -type d -exec rmdir {} +这并不完美;嵌套目录或大量匹配的目录仍然会导致错误消息的打印,但这应该适用于问题中的简单情况。
发布于 2019-05-31 16:38:46
您可以从find获得那些“没有这样的文件或目录”错误,因为find正在尝试输入它刚刚删除的目录。默认情况下,它将将其操作应用于当前正在访问的目录中的所有匹配内容,然后再继续进入子目录。
将-depth添加到find调用中,使find对其搜索路径执行深度优先搜索,这意味着如果您在目录上执行rmdir,它将已经访问过它,不会再次尝试访问它。
由于这个原因,在使用-depth时隐含了-delete选项(在有-delete的find的实现中)。
find . -depth -type d -exec rmdir {} \;-depth是find实用程序的标准选项。
注意,rmdir只在空目录上工作。如果你有很多非空目录,上面的命令会产生很多错误信息。
相反,如果您的find支持它,请使用-empty:
find . -type d -empty -delete这将删除空目录。
对于没有非标准-delete或-emtpy的D18:
find . -depth -type d -exec sh -c '
for dirpath do
set -- "$dirpath"/*
[ ! -e "$1" ] && rmdir "$dirpath"
done' sh {} +这将测试找到的目录是否为空,如果是,它们将被删除。
这是一段很长的代码,以避免由于目录是非空的而看到一些错误消息,但是产生的任何错误消息都有希望更有趣,因为它们可能是“拒绝权限”错误。在顶部的第一个/dev/null命令中将错误重定向到find,就会隐藏这些错误。
https://unix.stackexchange.com/questions/522173
复制相似问题