查找空目录UNIX

时间:2010-05-11 12:57:26

标签: 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

12 个答案:

答案 0 :(得分:237)

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

find test -depth -empty -delete

有关上述命令的注意事项是它还会删除空文件,因此请使用 -type d 选项来避免这种情况。

find test -depth -type d -empty -delete

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

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

find是一个很棒的实用程序,RTFM很早就经常了解它可以做多少: - )

答案 1 :(得分:37)

您可以使用以下命令:

find . -type d -empty

答案 2 :(得分:33)

检查find <dir> -type f是否输出任何内容,这是一个例子:

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

答案 3 :(得分:25)

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

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

mindepth选项可以防止目录本身被清空时删除。

答案 4 :(得分:21)

find . -type d -empty

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

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

目录没有进行任何操作。它们只是列出来的。 这对我有用。

答案 5 :(得分:16)

找到空目录

为了找到空目录(如问题标题中所指定),mosg's answer是正确的:

find -type d -empty

-empty版可能不适用于非常旧的find版本(例如HP-UX就是这种情况)。如果是这种情况,请参阅下面目录是否为空?中描述的技术。

删除空目录

这有点棘手:假设目录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 {} `;`

目录是否为空?

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

  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的评论进行了改进。如果您使用,并且您的脚本不必是可移植的,我建议这个。

    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) ]

    此技巧的灵感来自于2007年发布的nixCraft's articleAndrew Taylor在2008年得到回复,gr8can8dian在2011年回复。

    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。但是文件和空目录之间没有区别。

答案 6 :(得分: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。如果您在findempty "$dir"之后移动递归调用fi,该函数将在其结果中包含该目录。

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

find $dir -type d -prune -empty -exec false {} +

答案 9 :(得分:0)

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

test/
test/test2/
test/test2/test2.2/
test/test3/
test/test3/file

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

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

答案 10 :(得分:0)

一种简单的方法,

$ [ "$(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"

答案 11 :(得分:0)

find . -name -type d -ls |awk '($2==0){print $11}'