如何从命令行删除目录中的所有空目录?


Answers:


119

试试这个命令:

find . -empty -type d -delete

find命令用于从指定路径(在本例中为当前目录.)中搜索与特定搜索条件匹配的文件/目录。

-empty选项对于任何为空的文件和目录均适用。

-type d选项适用于真正的文件指定类型; 在这种情况下,d代表文件类型目录

-delete选项是要执行的操作,并且对于在搜索中找到的所有文件均适用。


我认为这是最简单的方法,因此我将继续并将其标记为已回答。
justingrif

嗨,比尔,我试图发布另一个类似的问题,但它不允许我,因为它说这是一个骗子,所以我希望您能够在这里回答我。说我想做与上述相同的事情,但是删除所有目录,无论它们是否为空。
justingrif 2011年

3
不管目录是否为空,删除目录的方式都请输入以下命令:rm -rf <directory-name>。这将删除目录及其所有内容,包括文件和子目录。该-r选项表示递归删除,而该-f命令表示删除前不提示。但是,如果要在删除目录/文件之前提示您,请将该-f选项替换为该-i选项。
条例草案

如果我要保留的目录中有一些文件,该怎么办。因此,我想删除/ foo / bar /中的所有目录,但保留其中可能存在的所有文件。
justingrif

2
这可以通过使用管道喂做这stdout一个命令(例如find)到stdin其他(例如rm),但是,必须非常小心,因为它可能消灭或删除文件/文件不想目录删除!有关如何执行此操作的更多信息,请参见man每个命令的页面。为了安全起见,在尝试使用真实事物之前,请始终在临时目录中对其进行测试。
条例草案

11

您可以利用rmdir命令的拒绝来删除非空目录,并find -depth可以自下而上遍历目录树:

find . -depth -exec rmdir {} \;  

(并忽略错误),或附加2>/dev/null以忽略它们。

开始查找的-depth选项find在目录树的底部。

rm -rf将删除所有文件在目录(及其子目录,并....)和所有的目录和一切。


8
rmdir *

将删除所有空目录。它将为每个非空目录和文件引发一个错误,以防止这些错误使您的终端混乱,请使用

rmdir * 2> /dev/null

这不适合脚本编写,因为它会以非零状态代码退出,但它可以工作。
the_drow 2013年

@the_drow如何使其不合适?顺便说一句,你也可以使用rmdir * 2>/dev/null || true。(find(1)方法更适合脚本编写,但由于其他原因:因为它可以更好地表达您想要执行的操作。)
Alois Mahdal

我经常在$HOME。带着邪恶的笑容。
Alois Mahdal 2015年

因为如果某些目录不为空,它将报告失败。
the_drow

这比find方法快吗?有人比较过这两个吗?
Xerus


0

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包含中的目录列表rf并将包含该文件夹中的文件列表。当然,如果fs为空,我们知道那r是空的。
  • first list-comprehension允许我们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)

对于简单的问题来说太复杂了:(
nurulhudamustaqim

@nurulhudamustaqim取决于观点。对于许多习惯使用Python的Linux用户而言,这实际上是非常适度的:)除此之外,它还很丰富。现代系统管理不仅限于bash或/bin/sh仅bash,而Python实际上是比这两种语言更优雅的语言
Sergiy Kolodyazhnyy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.