如何使用bash脚本在文件夹/目录上循环?

如何使用bash脚本在文件夹/目录上循环?,bash,shell,Bash,Shell,我试图统计文件夹中的所有.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无法访问i 问题是我不知道如

我试图统计文件夹中的所有.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无法访问i


问题是我不知道如何构建内部for循环,因为它取决于外部for循环(模式)?

我是一个变量,因此需要通过$引用它,即第二个循环应该是

for j in $(ls "$i") ; do

i是一个变量,因此您需要通过$引用它,即第二个循环应该是

for j in $(ls "$i") ; do
你想要避免,你想要

也不需要重复循环

printf 'x\n' /Da/* /Da/*/* | wc -l
还取决于您是否希望
/Da
中的条目是所有文件(在这种情况下,
/Da/*
就足够了)、所有目录(在这种情况下,仅
/Da/*/*
就够了),或者两者兼而有之。此外,如果您根本不想计算目录,可以切换到
find/Da-typef-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
你想要避免,你想要

也不需要重复循环

printf 'x\n' /Da/* /Da/*/* | wc -l
还取决于您是否希望
/Da
中的条目是所有文件(在这种情况下,
/Da/*
就足够了)、所有目录(在这种情况下,仅
/Da/*/*
就够了),或者两者兼而有之。此外,如果您根本不想计算目录,可以切换到
find/Da-typef-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
这对你有用

find . -name "*.txt" | wc -l
在第一部分中,
find
从该文件夹(
)及其子文件夹中查找
*.txt
。在第二部分中,
wc
统计
find

的返回行(
-l

find . -name "*.txt" | wc -l

在第一部分中,
find
从该文件夹(
)及其子文件夹中查找
*.txt
。在第二部分中,
wc
统计
find

的返回行(
-l
),使用
find
会更容易:
find/Da-name'*.txt'| wc-l
可能重复hi,问题是第一个循环和第二个循环之间的链接不起作用,我无法找到每个文件夹,其中也有文件夹。。。这就是为什么我要使用循环@reeena11
find
将递归到子目录中,如果您将名称放在诸如@melpomene did这样的引号中,那么脚本中的许多错误都可以通过该引号可靠地诊断出来,使用
find
find/Da-name'*.txt'| wc-l
可能会重复hi,问题是,第一个循环和第二个循环之间的链接不起作用,我无法找到每个文件夹,其中也有文件夹。。。这就是为什么我要使用循环@reeena11
find
将递归到子目录中,如果您将名称放在诸如@melpomene did之类的引号中,那么脚本中的许多错误都可以通过以下方法可靠地诊断:如果存在两个以上级别的子目录,则这与OP的尝试不同。你可以用
find-maxdepth
来解决这个问题,但是如果你知道嵌套的级别,你可以循环使用一个通配符。此外,如果文件名包含换行符,这仍然很容易产生错误的结果。我已经用我建议的命令尝试了六个级别的深度和几个分支,效果很好。当然,它适用于无限级别,但如果这不是OP想要做的,那还是错的。这个问题还不清楚,我认为他们不会澄清它;只是指出这是有区别的。如果有超过两个级别的子目录,这与OP的尝试有所不同。你可以用
find-maxdepth
来解决这个问题,但是如果你知道嵌套的级别,你可以循环使用一个通配符。此外,如果文件名包含换行符,这仍然很容易产生错误的结果。我已经用我建议的命令尝试了六个级别的深度和几个分支,效果很好。当然,它适用于无限级别,但如果这不是OP想要做的,那还是错的。这个问题还不清楚,我认为他们不会澄清它;只是指出这是有区别的。