从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