我正在寻找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文件。
第二个为什么要抓住所有目录
第三个没有捕获任何东西
答案 0 :(得分:1)
可以使用一个复杂的find
命令执行此操作,但如果将其分解为多个阶段,则更易于管理:
__init__.py
个文件。如果你使用-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
步骤:
-depth
在父母面前处理孩子。__init__.py
s。-print0
与read -d ''
配对,以确保我们正确处理包含空格和换行符的路径。__init__.py
,因此[[ -f && ! -s ]]
匹配空的init文件。 (($(ls -A1 "$(dirname "$path")" | wc -l) == 1))
检查init文件是其目录中唯一的文件。如果满足两个条件,则删除init文件。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