如何使用find测试目录是否为空

时间:2011-07-27 13:53:03

标签: linux unix scripting

我试图在unix shell脚本中编写一个if语句,如果它是空的则返回true,如果不是则返回false。

这类事......

if directory foo is empty then
echo empty
else
echo not empty
fi

我该怎么做?我被告知发现是一个很好的开始

9 个答案:

答案 0 :(得分:4)

简单 - 使用-empty标志。引用查找手册页:

 -empty  True if the current file or directory is empty.

类似于:

find . -type d -empty

将列出所有空目录。

答案 1 :(得分:2)

必须有一种更简单的方法,但您可以测试一个空/非空目录,ls -1A管道传输到wc -l

DIRCOUNT=$(ls -1A /path/to/dir |wc -l)
if [ $DIRCOUNT -eq 0 ]; then
  # it's empty
fi

答案 2 :(得分:1)

find directoryname -maxdepth 0 -empty

答案 3 :(得分:1)

三个最佳答案:

  1. 第一个是基于find作为OP请求;
  2. 第二个基于ls;
  3. 第三个是100%bash,但它会调用(生成)一个子shell。
  4. 1。 [ $(find your/dir -prune -empty) = your/dir ]

    dn=your/dir
    if [ x$(find "$dn" -prune -empty) = x"$dn" ]; then
      echo empty
    else
      echo not empty
    fi
    

    <强>试验:

    > 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
    

    find仅打印了两个空目录(empty1empty2)。

    此答案类似于-maxdepth 0 -empty中的Ariel。但这个答案有点短;)

    2。 [ $(ls -A your/directory) ]

    if [ "$(ls -A your/dir)" ]; then
      echo not empty
    else
      echo empty
    fi
    

    [ "$(ls -A your/dir)" ] && echo not empty || echo empty
    

    Michael Berkowskigpojd答案类似。但是在这里我们不需要管道wc。另请参阅Bash Shell Check Whether a Directory is Empty or Not nixCraft(2007)。

    3。 (( ${#files} ))

    files=$(shopt -s nullglob dotglob; echo your/dir/*)
    if (( ${#files} )); then 
      echo not empty
    else 
      echo empty or does not exist
    fi
    

    警告:如上例所示,空目录和不存在目录之间没有区别。

    最后一个答案来自Bruno De Fraine's answer以及teambob的优秀评论。

答案 4 :(得分:0)

你为什么要使用find?在bash中,ls -a将为空目录返回两个文件(...),并且对于非空目录应该具有更多文件。

if [ $(ls -a | wc -l) -eq 2 ]; then echo "empty"; else echo "not empty"; fi

答案 5 :(得分:0)

if [ `find foo | wc -l` -eq 1 ]
then
    echo Empty
else
    echo Not empty
fi

foo是此处的目录名称。

答案 6 :(得分:0)

如下所示

dircnt.sh:
-----------
#!/bin/sh

if [ `ls $1 2> /dev/null | wc -l` -gt 0 ]; then echo true; else echo false; fi

用法

andreas@earl ~
$ mkdir asal

andreas@earl ~
$ sh dircnt.sh asal
false

andreas@earl ~
$ touch asal/1

andreas@earl ~
$ sh dircnt.sh asal
true

答案 7 :(得分:0)

我不喜欢使用ls,因为我有一些非常大的目录,而且我讨厌浪费资源来用所有这些东西填充管道。

我也不喜欢用所有东西填充$ files变量。

因此,尽管@libre的所有答案都很有趣,但我发现它们都不可读,因此更喜欢使用我最喜欢的“查找”解决方案:

function isEmptyDir {
  [ -d $1 -a -n "$( find $1 -prune -empty 2>/dev/null )" ]
}

这样我就可以编写一年后可以阅读的代码,而不必问“我在想什么”?

if isEmptyDir some/directory
then
  echo "some/directory is empty"
else
  echo "some/directory does not exist, is not a directory, or is empty
fi

或者我可以使用其他代码来找出负面结果,但是该代码 应该很明显。无论如何,我马上就会知道我在想什么。

答案 8 :(得分:0)

没有脚本,没有 fork/exec(echo 是内置的)...

[ "$(cd $dir;echo *)" = "*" ] && echo empty || echo non-empty