1

我正在编写一个简单的 Bash 脚本,它需要找出目录中有多少文件。基本上,如果目录不包含文件,脚本将退出。如果有的话,它会做其他事情。

如何使用 Bash 找出目录中是否有文件?

谢谢!

4

4 回答 4

1

列出几乎(没有 . 或 ..)所有文件和目录并计算行数:ls -A1 /mydir | wc -l

如果您只想要文件,我认为您可以使用 find 代替:find /mydir -maxdepth 1 -type f | wc -l

于 2013-10-19T00:37:08.163 回答
0
shopt -s nullglob
cd /path/to/dir/
arr=( * )
echo "${#arr[@]}"
for i in "${!arr[@]}"; do echo "${arr[i]}"; done
于 2013-10-19T00:30:07.580 回答
0

其他答案向您展示了获取文件数量的方法。以下是如何在脚本中使用数字。

(这是在函数的上下文中显示的,$1是运行它时指定的目录名称。要在当前目录上使用它,只需省略它,或者您可以在该位置硬连线目录名称。)

checkdir(){
    numfiles=$(ls -A "$1" | wc -l)

    if [ $numfiles -gt 0 ]
    then
       echo YES;
    else
       echo NO;
    fi
}

注意:这会将目录计为文件。如果您想要文件,请ls...wc用以下行替换该部分:

ls -AF "$1" | grep -v "/$" | wc -l
于 2013-10-19T02:58:26.017 回答
0

我昨天需要同样的东西,发现了这个(它在页面底部附近):

# From http://www.etalabs.net/sh_tricks.html
is_empty () (
  cd "$1"
  set -- .[!.]* ; test -f "$1" && return 1
  set -- ..?* ; test -f "$1" && return 1
  set -- * ; test -f "$1" && return 1
  return 0 )

它是 POSIX 兼容的,并使用三种模式来匹配任何文件名...而不是保证存在于否则为空的目录中。

前两行匹配所有以单个.(长度至少为 2)或一个或多个.(长度至少为 3)开头的文件,它涵盖了所有不是.或的隐藏文件..。第三个模式匹配所有非隐藏文件。

请注意,函数的主体是一个(...)表达式,而不是{...}. 这会强制一个子shell,在其中可以安全地更改工作目录以简化模式。

于 2013-10-19T13:46:24.787 回答