我正在尝试计算文件夹中的所有.txt文件,问题是主文件夹有多个文件夹,并且在每个人的内部都有txt文件,因此总的来说,我想计算txt文件。到现在为止,我一直在尝试构建这样的解决方案,但是当然这是错误的:
#!/bin/bash
counter=0
for i in $(ls /Da) ; do
for j in $(ls i) ; do
$counter=$counter+1
done
done
echo $counter
我遇到的错误是:ls无法访问我...
问题在于我不知道如何构建内部for循环,因为它取决于外部for循环(模式)?
答案 0 :(得分:2)
这可以为您服务
find . -name "*.txt" | wc -l
在第一部分find
从此文件夹(*.txt
)及其子文件夹中查找.
。在第二部分wc
中计算-l
的返回行(find
)。
答案 1 :(得分:1)
您要避免使用parsing ls
,而您要quote your variables。
也不需要重复循环。
printf 'x\n' /Da/* /Da/*/* | wc -l
还取决于您是否希望/Da
中的条目是所有文件(在这种情况下/Da/*
就足够了),所有目录(在这种情况下仅/Da/*/*
就足够了),或两者。此外,如果您根本不想统计目录,则可以切换到find /Da -type f -printf 'x\n'
或类似名称。
根本不需要打印文件名;如果文件名应包含换行符(touch $'/Da/ick\npoo'
才能看到实际效果),这样可以避免得到错误的结果。
更一般地,正确的嵌套循环看起来像
for i in list of things; do
for j in different items, perhaps involving "$i"; do
things with "$j" and perhaps also "$i"
done
done
答案 2 :(得分:-1)
i是一个变量,因此您需要通过$引用它,即第二个循环应该是
for j in $(ls "$i") ; do