我想递归地搜索一些文件,并计算我发现的出现次数。要找到我做的文件:
file=$(find . -iname "*.xml")
现在,我想将出现的次数存储在另一个变量中。我只是不知道怎么做。我试过了:
n=$(echo $file | wc -l)
但我认为这不是正确的方式。。。
非常感谢您的帮助:(
您的命令中有一个拼写错误:}
不正确。
去掉它后,你的尝试非常接近,但你必须引用变量展开来保留换行符:
files=$(find . -iname '*.xml')
n=$(echo "$files" | wc -l)
echo "$n"
不过,对于具有外来名称的文件,这仍然可能会中断,例如在文件名中包含换行符。为了使它对所有可能的文件名都具有健壮性,您可以这样做(需要GNUfind
(:
files=$(find . -iname '*.xml' -printf '.')
echo "${#files}"
这将为找到的每个文件打印一个.
,然后对这些周期进行计数。
或者,如果您没有GNUfind
,您可以对文件名使用空字节分隔,并将其读取到数组中:
readarray -d '' files < <(find . -iname '*.xml' -print0)
echo "${#files[@]}"
或者对于readarray
无法指定要使用的分隔符的旧版本Bash(任何早于4.4的Bash(:
while IFS= read -r -d '' fname; do
files+=("$fname")
done < <(find . -iname '*.xml' -print0)
echo "${#files[@]}"
#!/bin/bash
# make an array
files=($(find . -name *.xml -print))
# number of array elements
fcnt=${#files[@]}
echo files: "${files[@]}"
echo
echo fcnt: $fcnt