如何使用shell expr来计算目录下的文件数

时间:2014-08-18 15:19:11

标签: linux shell

我想使用

计算目录下的文件数
if [ `expr ls -l $data_dir/*_1.data | wc -l`  == 1 ]
then
     #blabla
fi

但是bash不断弹出语法错误。 我错过了吗?

感谢。

2 个答案:

答案 0 :(得分:1)

使用普通shell:

if [ "$(exec find "$data_dir" -maxdepth 1 -mindepth 1 -name '*_1.data' | wc -l)" -eq 1 ]; then
    ...
fi

使用Bash:

shopt -s nullglob
FILES=("$data_dir"/*_1.data)
if [[ ${#FILES[@]} -eq 1 ]]; then
    ...
fi

答案 1 :(得分:0)

令人惊讶的是,没有好的方法来计算标准POSIX shell中目录中的文件数(可能是因为POSIX没有标准化文件系统的任何方面)。唯一可移植的方法是逐个计算:

count=0
for f in $data_dir/*_1.data; do
    [ -f "$f" ] && count=$((count + 1))
done

if [ "$count" -eq 1 ]; then
...
fi

如果你愿意,你可以尽早摆脱for循环。如果您关心至少有一个文件,请在count达到1后立即中断。如果您关心的只有一个文件,请在count超过1时立即中断。

使用find的大多数建议都依赖于-printf扩展名来输出保证不含任何空格的字符串。所有其他方法都容易受到潜在文件名中的空格(或至少是换行符)的影响,从而使计数失真。