【问题标题】:loop through all files in directory bash遍历目录bash中的所有文件
【发布时间】:2016-12-09 13:31:18
【问题描述】:

我知道以前有人问过这个问题。但是,这些示例似乎都不适合我。因此: 我有所有类型的文件 XXXX1.txt XXXX2.txt XXXX3.txt ... XXXX9.txt 在同一目录中。

现在我想使用 bash 从每个文件中 grep 某个值:

for file in *$i.txt
do
   for ((i = 1; i < 10; i++))
   do
   grep "energy" *.txt >> energies.txt
   done
done

代码和 grep 工作正常,没有任何错误,但我总是从第一次迭代中得到 grep,第一次能量打印了 9 次。它从不看其他人。我知道这种循环在 bash 中很复杂。但是,请不要建议将所有文件移动到单独的目录中并循环访问它们。

【问题讨论】:

  • 对于每个*$i.txt 匹配的文件(无论$i 是什么),您对匹配*.txt所有 文件运行grep 九次。你的意思是grep "energy" "$file" 吗?但是为什么要使用两个循环呢?!为什么不只是grep "energy" XXXX*.txt
  • 如果在循环内部定义$i,则不能在循环开头使用...
  • 我认为这个问题需要澄清很多才能回答。真正的目标是什么? $i 的值是多少?文件名是什么?外环有什么用?内循环有什么用?数字 9 有什么神奇之处?

标签: bash file loops directory


【解决方案1】:

您不需要如此复杂(且错误)的嵌套循环。 试试这个唯一的命令:

grep -h "energy" *{1..9}.txt >> energies.txt

【讨论】:

  • 如果文件不存在,这可能会引发错误grep: *3.txt: No such file or directory
  • @BigDataLearner 你是对的,但那是 OP 的初衷。我尊重它。
【解决方案2】:

如果您只需要文件内容:

grep -h "energy" *[1-9].txt >> energies.txt

如果您需要带有内容的文件名:

grep -H "energy" *[1-9].txt >> energies.txt

【讨论】:

  • 如果您不想要文件名,请将-h 选项添加到grep。如果您需要它们,即使*[1-9].txt 只匹配一个文件,也请添加-H 选项。
  • @xhienne - 很好 - 我更新了答案 - 我也学会了这个选项:) - 谢谢
猜你喜欢
  • 2015-03-05
  • 1970-01-01
  • 2019-01-10
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2021-01-16
  • 2014-10-02
相关资源
最近更新 更多