ls | 的打印输出wc -l 在包含两列的 txt 文件中

printing output of ls | wc -l in a txt file with two columns

我有很多目录,每个目录中都有不同数量的 CSV 文件。我有兴趣获取这些目录及其各自数量的 CSV 文件的列表。所以我有这个 bash 循环。

 for i in 21 22 23
do
ls my/directory/name$i/*csv | wc -l
done

问题是,我如何获得一个带有这样输出的 txt 文件?
name21  3
name22 5
name23 2

其中第一列对应每个目录的名称,第二列对应每个目录中CSV文件的数量。

您可以将命令的名称和结果回显到 output.txt:

for i in 21 22 23
 do
   echo name$i  $(ls my/directory/name$i/*csv | wc -l)
 done > output.txt

https://mywiki.wooledge.org/ParsingLs 解释了一些使用 ls 并解析其输出会产生错误或意外结果的场景。你会过得更好使用数组并计算其中的元素数。

for i in 21 22 23; do
   files=( my/directory/name$i/*csv )
   echo "name$i ${#files[@]}"
done >output.txt

也许还注意到done之后的重定向,这避免了在循环内重复打开和关闭同一个文件。

如果您想移植到没有数组的 POSIX sh,请尝试一个函数。

count () {
    echo "$#"
}

for i in 21 22 23; do
    echo "name$i $(count my/directory/name$i/*csv)"
done >output.txt

对于稳健性测试,请尝试创建名称有问题的文件,例如

touch my/directory/name21/"file name
with newline".csv my/directory/name22/'*'.csv