我正在编写一个简单的 Bash 脚本,它需要找出目录中有多少文件。基本上,如果目录不包含文件,脚本将退出。如果有的话,它会做其他事情。
如何使用 Bash 找出目录中是否有文件?
谢谢!
列出几乎(没有 . 或 ..)所有文件和目录并计算行数:ls -A1 /mydir | wc -l
如果您只想要文件,我认为您可以使用 find 代替:find /mydir -maxdepth 1 -type f | wc -l
shopt -s nullglob
cd /path/to/dir/
arr=( * )
echo "${#arr[@]}"
for i in "${!arr[@]}"; do echo "${arr[i]}"; done
其他答案向您展示了获取文件数量的方法。以下是如何在脚本中使用数字。
(这是在函数的上下文中显示的,$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
我昨天需要同样的东西,发现了这个(它在页面底部附近):
# 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,在其中可以安全地更改工作目录以简化模式。