假设我有一个名为 的目录foo/
。此文件夹包含子目录。如何用一个命令删除所有空目录?
答案1
尝试这个命令:
find . -empty -type d -delete
该find
命令用于从指定路径(在本例中为当前目录(因此为.
))搜索符合特定搜索条件的文件/目录。
该-empty
选项适用于任何空的文件和目录。
该-type d
选项适用于文件指定类型;在本例中d
代表文件类型目录。
该-delete
选项是需要执行的操作,适用于搜索中找到的所有文件。
答案2
您可以利用该rmdir
命令拒绝删除非空目录,以及find -depth
自下而上遍历目录树的选项:
find . -depth -exec rmdir {} \;
(并忽略错误),或者附加2>/dev/null
以真正忽略它们。
该-depth
选项find
开始在目录树的底部查找。
rm -rf
将删除所有文件在目录(及其子目录,和...)中,并且所有目录和所有。
答案3
rmdir *
将删除所有空目录。它会为每个非空目录和文件抛出一个错误,为了防止这些错误弄乱你的终端,请使用
rmdir * 2> /dev/null
答案4
Python 方法
$ tree
.
├── empty_dir1
├── empty_dir2
├── subdir1
│ ├── file1.abc
│ └── file2.abc
└── subdir2
├── file1.abc
└── file2.abc
4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│ ├── file1.abc
│ └── file2.abc
└── subdir2
├── file1.abc
└── file2.abc
其工作原理如下:
- 我们使用
os.walk()
函数递归遍历目录树。每次迭代时,r
设置为我们正在访问的当前文件夹,s
包含其中的目录列表r
,并将f
包含该文件夹中的文件列表。当然,如果f
和s
为空,我们知道为r
空。 - 首先,列表推导式允许我们
empty
根据上述评估来创建所有空目录的列表。 - 第二个函数
map()
用于os.rmdir()
对列表中的每个项目执行操作empty
。可以使用列表推导式作为替代方法。
脚本如下:
#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
if not f and not s and r != ".":
empty.append(r)
for i in empty:
os.rmdir(i)