2017-10-19 160 views
2

我正在寻找一个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捕获所有目录

三不捕获任何

+0

喜欢的东西**对于f在$(find。-name \ __ init _ \ _。py -type f -size 0); do [$(ls $ {f%/ *} | wc -l)= 1] && rm -rf $ {f%/ *};完成** – 0andriy

回答

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__.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运行此脚本。
+0

此解决方案不起作用,因为我不想先删除empy __init__.py文件。 可能有目录,其中包含一些文件+空__init__.py文件和其他东西,然后__init__将被删除,没有任何用途。 –

+0

更新为还检查'__init __。py'是其目录中唯一的文件。 –

0

您听起来像您已经介绍了如何使用您的第一个查找命令删除空目录。要删除那些在他们的空文件的任何目录,你可以使用:

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 
+0

这是行不通的,因为-size 0 doens't返回目录 –

+0

对,我找到空文件,但是用'-exec dirname {}'得到它们所在目录的名字,然后用管道目录到'rm -rf' – element4lifex8

相关问题