shell命令删除所有带有空__init__.py文件的目录

时间:2017-10-19 11:12:09

标签: linux shell

我正在寻找Linux shell的命令,它会递归删除包含__init__.py文件和/或其他空目录的所有目录。因此,如果该目录中的任何文件实际上至少包含一个字节,则不应将其删除。

因此,换句话说,递归删除所有空的python模块。 请注意,如果目录包含除空 init .py文件之外的任何内容 - 则不应将其删除。

到目前为止我发现/尝试的是:

find . -type d -empty -delete

find .  -type d -size -5k -delete

find .  -type d -size 0 -delete

首先删除没有文件的目录(在我的示例中,它们包含空的 init .py文件。

第二个为什么要抓住所有目录

第三个没有捕获任何东西

2 个答案:

答案 0 :(得分:1)

可以使用一个复杂的find命令执行此操作,但如果将其分解为多个阶段,则更易于管理:

  1. 删除空__init__.py个文件。
  2. 删除空目录。
  3. 如果你使用-depth自下而上,那么它自然会删除只包含空init文件和/或嵌套空目录的目录。

    find -depth '(' -type d -o -name __init__.py ')' -print0 |
        while IFS= read -d '' -r path; do
            [[ -f $path && ! -s $path ]] && (($(ls -A1 "$(dirname "$path")" | wc -l) == 1)) && rm "$path"
            rmdir "$path" 2> /dev/null || :
        done 
    

    步骤:

    1. 使用-depth在父母面前处理孩子。
    2. 查找目录和__init__.py s。
    3. 循环处理每个匹配。 -print0read -d ''配对,以确保我们正确处理包含空格和换行符的路径。
    4. 我们匹配的唯一文件是__init__.py,因此[[ -f && ! -s ]]匹配空的init文件。 (($(ls -A1 "$(dirname "$path")" | wc -l) == 1))检查init文件是其目录中唯一的文件。如果满足两个条件,则删除init文件。
    5. 尝试rmdir路径。如果它是一个空目录,它将被删除。如果它是一个文件或非空目录,它将不会。没关系:用2> /dev/null抑制错误。 || :会忽略失败的退出代码,因此使用set -e运行此脚本是安全的。

答案 1 :(得分:0)

您似乎已经了解了如何使用第一个find命令删除空目录。要删除其中包含空文件的任何目录,您可以使用:

find . -size 0 -exec dirname {} + | xargs rm -rf

这里find命令将获取包含空文件的每个目录的目录名,然后所有目录名都将通过管道输出到xargs,这将删除它们。

如果__init.py__以外的文件可能为空,那么您可以直接指定只有名为__init.py__的0字节文件与find命令匹配:

find . -size 0 -and -name "__init.py__" -exec dirname {} + | xargs rm -rf