Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux shell命令以删除带有空的_init__u;.py文件的所有目录_Linux_Shell - Fatal编程技术网

Linux shell命令以删除带有空的_init__u;.py文件的所有目录

Linux shell命令以删除带有空的_init__u;.py文件的所有目录,linux,shell,Linux,Shell,我正在寻找一个用于Linux shell的命令,该命令将递归删除包含justempty\uuuu init\uuuuuuuuupy文件和/或其他空目录的所有目录。因此,如果该目录中的任何文件实际上至少包含一个字节,则不应将其删除 因此,换句话说,递归地删除所有空python模块。 请注意,若目录包含除空init.py文件以外的任何内容,则不应将其删除 到目前为止,我发现/尝试的是: find . -type d -empty -delete 及 及 第一个删除没有文件的目录(在我的示例中,它们

我正在寻找一个用于Linux shell的命令,该命令将递归删除包含justempty
\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