Bash 查找空目录

Bash 查找空目录,bash,unix,directory,Bash,Unix,Directory,我需要为给定的目录列表找到空目录。 有些目录中有目录 如果内部目录也是空的,我可以说主目录是空的,否则它不是空的 我如何测试这个 例如: A>A1(file1),A2 this is not empty beacuse of file1 B>B1(no file) this is empty C>C1,C2 this is empty 检查find-type f是否输出任何内容。下面是一个例子: for dir in A B C; do [ -z "`find $di

我需要为给定的目录列表找到空目录。 有些目录中有目录

如果内部目录也是空的,我可以说主目录是空的,否则它不是空的

我如何测试这个

例如:

A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
检查
find-type f
是否输出任何内容。下面是一个例子:

for dir in A B C; do
    [ -z "`find $dir -type f`" ] && echo "$dir is empty"
done

可以使用以下命令:

find . -type d -empty

我创建了一个简单的结构,如下所示:


试验/
测试/测试2/
test/test2/test2.2/
测试/测试3/
test/test3/file

test/test3/文件
包含一些垃圾文本


发出
findtest-empty
返回“
test/test2/test2.2
”作为唯一的空目录

$ [ "$(ls -A /path/to/direcory)" ] && echo "not empty" || echo "its empty"
而且


这在一定程度上取决于您希望如何处理空目录。当我希望删除树中的所有空目录时,我使用下面的命令,比如
test
directory

find test -depth -empty -delete
关于上面的命令需要注意的一点是,它还将删除空文件,因此使用-type d选项可以避免这种情况

find test -depth -type d -empty -delete
拖放
-删除
,查看匹配的文件和目录

如果您对空目录树的定义是它不包含任何文件,那么您可以根据
find test-type f
是否返回任何内容来将某些内容粘在一起


find
是一个很好的实用程序,RTFM很早就开始了,而且经常是为了真正了解它能做多少:-)

这个递归函数似乎可以做到以下几点:

# Bash
findempty() {
    find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir
    do
        if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null
        then
            findempty "$dir"
            echo "$dir"
        fi
    done
}
给定此示例目录结构:

. |-- dir1/ |-- dir2/ | `-- dirB/ |-- dir3/ | `-- dirC/ | `-- file5 |-- dir4/ | |-- dirD/ | `-- file4 `-- dir5/ `-- dirE/ `-- dir_V/ . |--dir1/ |--dir2/ |“迪布/ |--dir3/ |`--dirC/ |`--file5 |--dir4/ ||--dirD/ |`--file4 `--dir5/ `--可怕的/ `--迪鲁V/ 运行该功能的结果将是:

./dir1 ./dir5/dirE/dir_V ./dir5/dirE ./dir5 ./dir2/dirB ./dir2 /dir1 /dir5/dir/dir\u V /dir5/dir /第5条 /dir2/dirB /dir2 未命中
/dir4/dirD
。如果将递归调用
findempty“$dir”
移动到
fi
之后,函数将在其结果中包含该目录

find . -name -type d -ls |awk '($2==0){print $11}'
这是我发现最有趣的版本。如果从目录内部执行,它将删除下面的所有空目录(如果目录仅包含空目录,则视为空目录)

mindepth选项可防止目录本身在恰好为空时被删除。

只需查找空目录即可 为了只查找空目录(如问题标题中所述),正确的方法是:

find -type d -empty
但是
-empty
在非常旧的
find
版本上可能不可用(例如,这种情况)。如果这是您的情况,请参阅下面一节中描述的技术:目录是否为空

删除空目录 这有点棘手:假设目录
MyDir
包含空目录。删除这些空目录后,
MyDir
将成为一个空目录,也应删除。因此,我使用命令
rmdir
和选项
--parents
(或
-p
)在可能的情况下也会删除父目录:

find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
在较旧的
find
版本中,语句
+
尚不受支持,因此您可以使用
改为:

find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
目录是空的吗? 大多数答案解释了如何检查目录是否为空。因此,我在这里提供了我知道的三种不同技术:

  • [$(找到你的/dir-prune-empty)=你的/dir]

    d=your/dir
    if [ x$(find "$d" -prune -empty) = x"$d" ]
    then
      echo "empty (directory or file)"
    else
      echo "contains files (or does not exist)"
    fi
    
    一种变体:

    d=your/dir
    if [ x$(find "$d" -prune -empty -type d) = x"$d" ]
    then
      echo "empty directory"
    else
      echo "contains files (or does not exist or is not a directory)"
    fi
    
    说明:

    • find-prune
      find-maxdepth 0
      相似,使用的字符更少
    • find-type d
      仅打印目录
    • find-empty
      打印空目录和文件

      > mkdir -v empty1 empty2 not_empty
      mkdir: created directory 'empty1'
      mkdir: created directory 'empty2'
      mkdir: created directory 'not_empty'
      > touch not_empty/file
      > find empty1 empty2 not_empty -prune -empty
      empty1
      empty2
      
  • (${files}))

    d=your/dir
    if [ x$(find "$d" -prune -empty) = x"$d" ]
    then
      echo "empty (directory or file)"
    else
      echo "contains files (or does not exist)"
    fi
    
    这个技巧是100%
    bash
    ,但会调用(生成)一个子shell。这一想法来源于他的评论,并得到了改进。如果您使用并且您的脚本不必是可移植的,我建议您使用这个脚本

    files=$(shopt -s nullglob dotglob; echo your/dir/*)
    if (( ${#files} ))
    then 
      echo "contains files"
    else 
      echo "empty (or does not exist or is a file)"
    fi
    
    注意:空目录和不存在的目录之间没有区别(即使提供的路径是文件)

  • [$(ls-A您的/dir)]

    d=your/dir
    if [ x$(find "$d" -prune -empty) = x"$d" ]
    then
      echo "empty (directory or file)"
    else
      echo "contains files (or does not exist)"
    fi
    
    这个技巧的灵感来自2007年发布的文章。在2008年和2011年回答

    或者一行巴西主义版本:

    [[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
    
    注意:
    ls
    在目录不存在时返回
    $?=2
    。但文件和空目录之间没有区别


  • 怎么样
    rmdir*
    ?该命令将在非空目录上失败。

    find-类型d-空

    查找并列出当前树中的空目录和子目录。 例如,空目录和子目录的结果列表:

    ./2047
    ./2032
    ./2049
    ./2063
    ./NRCP26LUCcct1/2039
    ./NRCP26LUCcct1/2054
    ./NRCP26LUCcct1/2075
    ./NRCP26LUCcct1/2070
    
    没有对目录进行任何操作。它们只是简单地列出。
    这对我很有用。

    如果目录为空(或不存在),则以下命令返回1,否则返回0(因此可以在shell脚本中使用
    反转返回代码):

    find$dir-type d-prune-empty-exec false{}+
    
    -仅当当前目录完全为空时,“空”才起作用,如果子树不包含任何文件则不起作用。@soField Tested find-类型d-使用FreeBSD和CentOS为空。很好。您的操作系统是什么?hp ux,因此没有空的parameter@soField所以,你看,最好(对我们所有人来说)把这些数据放在问题的最前面……在solaris上,find也没有-empty,但是它有-depth来强制执行深度优先遍历,以便在检查父目录是否为空之前删除空的子目录。不,它不会输出子目录。这就是
    -typef
    的用途。但是,如果存在空文件,您的解决方案将不会产生消息。Yasir:我认为目录
    [[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
    
    ./2047
    ./2032
    ./2049
    ./2063
    ./NRCP26LUCcct1/2039
    ./NRCP26LUCcct1/2054
    ./NRCP26LUCcct1/2075
    ./NRCP26LUCcct1/2070