我已经编写了下面的脚本,但现在无论目录中有多少个文件,它都会返回 0 表示目录中的文件数。
source ~/Alan/assign/changeDir.sh
num=$(( ls | wc -l ))
echo $num
changeDir.sh脚本如下
function my_cd() {
cd ~/Alan
}
我所需要的只是返回一个数字,以便稍后在同一脚本中使用它。我非常感谢对此的指导。谢谢
答案1
要查找单个目录中的名称数量,请展开*
其中的 glob 并计算生成的单词数:
shopt -s nullglob # to make the * glob expand to nothing
# if there is no matching names
set -- *
num=$#
printf '%s\n' "$num"
特殊值$#
是位置参数的数量。该set
命令设置位置参数。
你想数一数吗常规的仅文件,并包含隐藏名称,然后使用
shopt -s nullglob dotglob
for name in *; do
if [ ! -f "$name" ] || [ -L "$name" ]; then
# skip non-regular files and symbolic links
continue
fi
files+=( "$name" )
done
num=${#files[@]}
printf '%s\n' "$num"
要在子目录中递归执行此操作,还需设置globstar
shell 选项并用作**/*
通配模式。
(在zsh
shell 中,使用 就足够了set -- **/*(.DN); print $#
)
你的问题
num=$(( ls | wc -l ))
是双重的:
$(( ... ))
是算术展开式。您可能需要在这里进行命令替换,$( ... )
.- 不会
wc -l
计算文件数。它将计算 输出的换行符数量ls
。名称中包含一个或多个换行符的文件将被计为多个文件wc -l
。您可以通过使用创建这样的文件来测试这一点touch $'hello\nworld'
。
答案2
如果您想计算包含隐藏文件 ( .*
) 的文件,但排除子目录,您可以使用:
find . -maxdepth 1 -type f -printf '.' | wc -c
的所有好处都find
可以利用。