这个命令是如何实现子目录删除后父目录也被删除的呢?

这个命令是如何实现子目录删除后父目录也被删除的呢?

https://unix.stackexchange.com/a/24163/167166

find . -type d -depth -empty -exec rmdir "{}" \;

这将首先向下钻取目录树,直到找到第一个空目录,然后将其删除。从而使父目录为空,然后将其删除,等等。这将产生所需的效果(我可能每周这样做 10 次,所以我很确定这是正确的)。 :-)

如何让子目录删除后父目录也被删除呢?

谢谢。

答案1

来自find联机帮助页:

-depth在处理目录本身之前处理每个目录的内容。动作-delete还暗示着-depth

find . -type d -depth -empty -exec rmdir "{}" \;

find从当前目录开始,查找其中包含的所有文件和目录(以及子目录等);然后,它会处理每个目录,从目录的内容开始,然后再处理父目录。想象一下下面的树:

.
├── a
│   ├── c
│   └── d
│       └── e
└── b

find . -depth显示处理的顺序:

./a/c
./a/d/e
./a/d
./a
./b
.

正如您所看到的,孩子们列在父母之前。在更复杂的find命令中,这些动作将先于父母应用于儿童;在您给出的示例中,将首先处理空叶目录,如果它们为空,则将其删除;那么他们的父母将被处理,反过来如果他们是空(可能是这种情况,因为它们的空子级已被删除),也被删除,依此类推一直返回到当前目录。

例如,如果省略-depth,则按枚举顺序处理文件find

.
./a
./a/c
./a/d
./a/d/e
./b

所以.先处理;它不是空的,所以它被单独留下。那么a,同样适用。然后a/c;因为它是空的所以被删除。a/d被保留,a/d/e被删除,按原样b。但find不会重新访问已经处理过的目录,因此即使我们希望删除它们,a也会保留它们。a/d

相关内容