shell命令删除空的__init__.py文件的所有目录
我正在寻找一个Linux shell的命令,它将递归删除所有包含的目录只是空的__init__.py
文件和/或其他空目录。因此,如果该目录中的任何文件实际上至少包含一个字节,则不应将其删除。shell命令删除空的__init__.py文件的所有目录
因此,换句话说,要递归删除所有空的python模块。 请注意,如果目录包含其他内容但空init .py文件 - 它不应该被删除。
我学到了什么/试过到目前为止是:
find . -type d -empty -delete
而且
find . -type d -size -5k -delete
而且
find . -type d -size 0 -delete
第一个删除目录,而文件(在我的例子,他们包含空的初始化 .py文件。
第二个somewhy捕获所有目录
三不捕获任何
它可能会用一个复杂的find
命令要做到这一点,但如果你把它分解成阶段,它更易于管理:
- 删除空的
__init__.py
文件。 - 删除空目录。
如果你这样做自下而上使用-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
步骤:
- 使用
-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
运行此脚本。
此解决方案不起作用,因为我不想先删除empy __init__.py文件。 可能有目录,其中包含一些文件+空__init__.py文件和其他东西,然后__init__将被删除,没有任何用途。 –
更新为还检查'__init __。py'是其目录中唯一的文件。 –
您听起来像您已经介绍了如何使用您的第一个查找命令删除空目录。要删除那些在他们的空文件的任何目录,你可以使用:
find . -size 0 -exec dirname {} + | xargs rm -rf
这里find命令将包含空文件,然后将每个目录下的所有目录名称将通过管道输送到xargs的,这将删除它们得到的目录名。
如果您有__init.py__可能为空的其他文件,那么你可以直接指定,只有0字节的文件名为__init.py__与匹配find命令:
find . -size 0 -and -name "__init.py__" -exec dirname {} + | xargs rm -rf
这是行不通的,因为-size 0 doens't返回目录 –
对,我找到空文件,但是用'-exec dirname {}'得到它们所在目录的名字,然后用管道目录到'rm -rf' – element4lifex8
喜欢的东西**对于f在$(find。-name \ __ init _ \ _。py -type f -size 0); do [$(ls $ {f%/ *} | wc -l)= 1] && rm -rf $ {f%/ *};完成** – 0andriy