Linux shell命令以删除带有空的_init__u;.py文件的所有目录
我正在寻找一个用于Linux shell的命令,该命令将递归删除包含justemptyLinux shell命令以删除带有空的_init__u;.py文件的所有目录,linux,shell,Linux,Shell,我正在寻找一个用于Linux shell的命令,该命令将递归删除包含justempty\uuuu init\uuuuuuuuupy文件和/或其他空目录的所有目录。因此,如果该目录中的任何文件实际上至少包含一个字节,则不应将其删除 因此,换句话说,递归地删除所有空python模块。 请注意,若目录包含除空init.py文件以外的任何内容,则不应将其删除 到目前为止,我发现/尝试的是: find . -type d -empty -delete 及 及 第一个删除没有文件的目录(在我的示例中,它们
\uuuu init\uuuuuuuuupy
文件和/或其他空目录的所有目录。因此,如果该目录中的任何文件实际上至少包含一个字节,则不应将其删除
因此,换句话说,递归地删除所有空python模块。
请注意,若目录包含除空init.py文件以外的任何内容,则不应将其删除
到目前为止,我发现/尝试的是:
find . -type d -empty -delete
及
及
第一个删除没有文件的目录(在我的示例中,它们包含空的init.py文件)
第二个somewhy捕获所有目录
第三种方法不捕获任何内容,只需一个复杂的
find
命令就可以做到这一点,但如果将其分为几个阶段,则更易于管理:
\uuuu init\uuuuu.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
在父母之前处理孩子\uuuu init\uuuuu.py
s-print0
与read-d''
配对,以确保正确处理带有空格和换行符的路径\uuu init\uuuuuy.py
,因此[-f&&!-s]
匹配空的init文件。($(ls-A1“$(dirname“$path”)“| wc-l)==1))
检查init文件是否是其目录中唯一的文件。如果两个条件都满足,则删除init文件rmdir
路径。如果它是一个空目录,它将被删除。如果它是一个文件或非空目录,它将不会被删除。这很好:错误被2>/dev/null
抑制|;:
忽略失败的退出代码,使使用set-e
运行此脚本变得安全听起来您好像已经用第一个find命令介绍了如何删除空目录。要删除其中包含空文件的任何目录,您可以使用:
find . -size 0 -exec dirname {} + | xargs rm -rf
在这里,find命令将获得包含空文件的每个目录的目录名,然后所有目录名将通过管道传输到xargs,xargs将删除这些文件
如果除uuu init.py uuu之外的文件可能为空,则可以直接指定只有名为uuu init.py uu的0字节文件与find命令匹配:
find . -size 0 -and -name "__init.py__" -exec dirname {} + | xargs rm -rf
类似于$(find.-name uuu init uuuy.py-type f-size 0);do[$(ls${f%/*}wc-l)=1]&&rm-rf${f%/*};这样做不起作用,因为-size 0不返回directoriesRight,我正在查找空文件,但用
-exec dirname{}获取它们所在的目录名
然后将该目录传送到rm-rf
此解决方案不起作用,因为我不想先删除empy init.py文件。可能存在包含一些文件+空init.py文件和其他内容的目录,然后init将被无目的地删除。更新以检查\u init\uuuuuuuuuuuy.py
是否是中的唯一文件它的目录。
find . -size 0 -exec dirname {} + | xargs rm -rf
find . -size 0 -and -name "__init.py__" -exec dirname {} + | xargs rm -rf