【问题标题】:shell command to delete all directories with empty __init__.py fileshell 命令删除所有带有空 __init__.py 文件的目录
【发布时间】:2017-10-20 21:22:28
【问题描述】:

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

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

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

find . -type d -empty -delete

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

find .  -type d -size 0 -delete

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

第二个为什么会捕获所有目录

Third 没有捕捉到任何东西

【问题讨论】:

  • 类似于 for f in $(find . -name __init__.py -type f -size 0);做 [ $(ls ${f%/*} | wc -l) = 1 ] && rm -rf ${f%/*};完成

标签: linux shell


【解决方案1】:

也许可以用一个复杂的find 命令来做到这一点,但如果你把它分成几个阶段,它会更易于管理:

  1. 删除空的__init__.py 文件。
  2. 删除空目录。

如果您使用 -depth 从下向上执行此操作,那么它自然会删除仅包含空初始化文件和/或嵌套空目录的目录。

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__.pys。
  3. 循环处理每个匹配项。 -print0read -d '' 配对,以确保我们正确处理带有空格和换行符的路径。
  4. 我们匹配的唯一文件是__init__.py,所以[[ -f && ! -s ]] 匹配空的初始化文件。 (($(ls -A1 "$(dirname "$path")" | wc -l) == 1)) 检查初始化文件是否是其目录中的唯一文件。如果两个条件都满足,则删除 init 文件。
  5. 尝试rmdir 路径。如果它是一个空目录,它将被删除。如果它是文件或非空目录,则不会。没关系:使用2> /dev/null 抑制错误。 || : 会忽略失败的退出代码,从而可以安全地使用 set -e 运行此脚本。

【讨论】:

  • 此解决方案不起作用,因为我不想先删除 empy init.py 文件。可能有目录,其中包含一些文件 + 空 init.py 文件和其他内容,然后 init 将被无缘无故地删除。
  • 更新后还检查 __init__.py 是其目录中的唯一文件。
【解决方案2】:

您听起来好像已经了解了如何使用第一个 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

【讨论】:

  • 这不起作用,因为 -size 0 不返回目录
  • 对,我正在查找空文件,然后使用-exec dirname {} 获取它们所在目录的名称,然后将该目录传递给rm -rf
猜你喜欢
  • 2014-02-27
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2017-05-13
  • 2013-01-11
  • 2011-01-02
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多