使用 .sh 文件返回目录中的文件数量

使用 .sh 文件返回目录中的文件数量

我已经编写了下面的脚本,但现在无论目录中有多少个文件,它都会返回 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"

要在子目录中递归执行此操作,还需设置globstarshell 选项并用作**/*通配模式。

(在zshshell 中,使用 就足够了set -- **/*(.DN); print $#

你的问题

num=$(( ls | wc -l ))

是双重的:

  1. $(( ... ))是算术展开式。您可能需要在这里进行命令替换,$( ... ).
  2. 不会wc -l计算文件数。它将计算 输出的换行符数量ls。名称中包含一个或多个换行符的文件将被计为多个文件wc -l。您可以通过使用创建这样的文件来测试这一点touch $'hello\nworld'

答案2

如果您想计算包含隐藏文件 ( .*) 的文件,但排除子目录,您可以使用:

find . -maxdepth 1 -type f -printf '.' | wc -c

的所有好处都find可以利用。

答案3

我认为问题是命令替换中的语法错误。

命令

num=$(( expression ))

将把括号的内容解释为算术表达式并将数值结果赋给num.它会不是返回以代码形式写入括号内的运行输出。相反,lswc和将被解释为 shell 变量,并且执行“ OR minus ”l操作,结果为零,因为这些“变量”都没有被初始化。$ls$wc$l

你可能想要做的事情会写成

num="$(ls | wc -l)"

然而,即便如此,解析输出ls一般来说这不是一个好主意。相反,看看一些答案这个类似的问题其中提供了“强大”的解决方案,当文件名包含特殊字符时也可以使用。

相关内容