如何检查文件夹是否为空或文件夹文件是否使用shell脚本?

时间:2010-11-23 07:25:57

标签: linux shell

我有一个问题

我尝试了一些像

这样的功能
  

DIR = /路径/ TMP /

     

if [-d“$ DIR”];那么

  

if [-f“$ DIR”];那么

但只检查/ path / tmp此路径

我该怎么办?

7 个答案:

答案 0 :(得分:18)

来自Bash FAQ#4 - 如何检查目录是否为空?

shopt -s nullglob dotglob
files=(*)
(( ${#files[*]} )) || echo directory is empty
shopt -u nullglob dotglob

这个小脚本使用路径扩展files中找到的每个文件填充数组*。然后它检查以查看数组的大小,如果它为0则打印'目录为空'。由于使用dotglob

,这将与隐藏文件一起使用

注意

要求解析ls的答案通常是一个坏主意和糟糕的形式。要了解原因,请阅读Why you shouldn't parse the output of ls

答案 1 :(得分:15)

您可以使用ls -A

if [ "$(ls -A "$DIR" 2> /dev/null)" == "" ]; then
    # The directory is empty
fi

-A显示除...之外的所有隐藏文件和目录,因此它在空目录中为空,在任何目录中为空文件或子目录。

2> /dev/null抛弃了ls可能打印的任何错误消息(请注意,检查不存在的目录会产生误报,但您说您已经检查过它存在)。检查您没有读取权限的目录也会产生误报。

答案 2 :(得分:1)

[ -z "$(find "$DIR" -maxdepth 0 -empty)" ] || echo "$DIR is empty!"

find具有谓词{{​​1}},用于测试目录或文件是否为空,因此只有在目录或文件为空时才会列出该目录。 -empty测试find的输出是否为空。如果是,那么该目录包含条目,如果不是,那么它是空的。

用其他代码词:

-z

另一个非常好的:

[ -n "$(find "$DIR" -maxdepth 0 -empty)" ] && echo "$DIR is empty!"

答案 3 :(得分:0)

为什么不使用ls -v?如果没有

这样的文件,那么会打印出来
if $(ls -v $DIR)

答案 4 :(得分:0)

这告诉我目录是否为空或者不是,它包含的文件数量。

directory="/path/tmp"
number_of_files=$(ls -A $directory | wc -l)

if [ "$number_of_files" == "0" ]; then
    echo "directory $directory is empty"
else
    echo "directory $directory contains $number_of_files files"
fi

答案 5 :(得分:0)

要仅使用shell内置函数(它应该适用于我使用过的所有shell):

if test "`echo /tmp/testdir/* /tmp/testdir/.?*`" = \
    "/tmp/testdir/* /tmp/testdir/.."; then
  [...]
fi

我们不检查/tmp/testdir/.*,因为它会扩展到/ tmp / testdir /。 / tmp / testdir / ..表示空文件夹。

另一种内置版本:

for i in /tmp/testdir/* /tmp/testdir/.?*; do
    test -e $i || break
    [...]
    break
done

答案 6 :(得分:-2)

rmdir "$DIR"

如果$?为1,则目录不为空。如果为0,则为空并且将被删除。

如果您不打算将其删除,则可以重新创建它:mkdir "$DIR"