查找空目录UNIX

我需要为给定的目录列表find空目录。 一些目录里面有目录。

如果里面的目录也是空的,我可以说主目录是空的,否则它不是空的。

我如何testing这个?

例如:

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 <dir> -type f输出任何东西,这里是一个例子:

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

这取决于你想用空目录做什么。 当我想删除树中的所有空目录时,使用下面的命令,比如说test目录。

 find test -depth -empty -delete 

有一件事要注意上面的命令, 它也会删除空文件 ,所以使用-type d选项来避免这种情况。

 find test -depth -type d -empty -delete 

删除 – 删除以查看匹配的文件和目录。

如果你的空目录树的定义是它没有包含任何文件,那么你可以根据find test -type f是否返回任何东西来把东西粘在一起。

find是一个伟大的实用程序,RTFM早期,往往要真正了解它可以做多少:-)

找 。 型d-空

 find directory -mindepth 1 -type d -empty -delete 

这是我发现最有趣的版本。 如果从内部目录执行,它将删除下面的所有空目录(如果一个目录只包含空目录,则该目录被认为是空的)。

mindepth选项防止目录本身被删除,如果它是空的。

只要找到空的dirs

为了找到空目录(问题标题中指定), mosg的答案是正确的:

 find -type d -empty 

-empty可能不适用于非常旧的find版本(例如, HP-UX就是这种情况)。 如果这是你的情况,请参阅下面的部分介绍的技术是一个目录为空?

删除空的dirs

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

 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 {} `;` 

目录是空的吗?

这些答案大多解释如何检查一个目录是否为空。 所以我在这里提供了我所知道的三种不同的技术:

  1. [ $(find your/dir -prune -empty) = your/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 
  2. (( ${#files} ))

    这个技巧是100% bash但调用(派生)一个子shell。 这个想法来自Bruno De Fraine ,并由teambob的评论改进。 我建议这个如果你使用bash ,如果你的脚本不必是可移植的。

     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 

    注意:空目录和不存在的目录(甚至当提供的路径是文件时)没有区别。

  3. [ $(ls -A your/dir) ]

    这个诀窍是从nixCraft 2007年发表的文章中得到的启示。Andrew Taylor在2008年回答,2011年在gr8can8dian回答。

     if [ "$(ls -A your/dir)" ] then echo "contains files" else echo "empty (or does not exist or is a file)" fi 

    或者单行双语版本:

     [[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..." 

    注意:当目录不存在时, ls返回$?=2 。 但是一个文件和一个空目录没有区别。

find . -type d -empty

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

 ./2047 ./2032 ./2049 ./2063 ./NRCP26LUCcct1/2039 ./NRCP26LUCcct1/2054 ./NRCP26LUCcct1/2075 ./NRCP26LUCcct1/2070 

目录上没有任何操作。 他们只是列出。 这对我有用。

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

测试/
测试/ TEST2 /
测试/ TEST2 / test2.2 /
测试/ TEST3 /
测试/ TEST3 /文件

test/test3/file包含一些垃圾文本。

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

这个递归函数似乎有诀窍:

 # 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
     ./dir5/dirE/dir_V
     ./dir5/dirE
     ./dir5
     ./dir2/dirB
     ./dir2

错过/dir4/dirD 。 如果您在fi之后移动递归调用findempty "$dir" ,函数将在其结果中包含该目录。

一个简单的方法是,

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

也,

 if [ "$(ls -A /path/to/direcory)" ]; then echo "its not empty" else echo "empty directory" 
 find . -name -type d -ls |awk '($2==0){print $11}' 

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