【问题标题】:shell script looping through some files in direcctoryshell脚本循环遍历目录中的一些文件
【发布时间】:2017-04-04 00:36:36
【问题描述】:

我有一个充满 csv 文件的目录,在运行时我将生成一些中间 csv 文件。我只想迭代原始文件,而不是运行时生成的文件。原来的以“2017”开头,所以我想的是这样的:

for FILE in "$data_dir"2017*_"$i".csv;

其中 $i 来自于遍历此文件名中的潜在字符串数组。但是,即使我希望结果是:

20170301_file1.csv 20170301_file2.csv 20170301_file3.csv 20170302_file1.csv

等等,echo 上的 $FILE 返回:

2017*_file1.csv
2017*_file2.csv
2017*_file3.csv

我不确定如何更改我的 for 语句中的 2017* 部分。

【问题讨论】:

  • 似乎最简单的做法是使用单独的目录。

标签: bash shell file unix


【解决方案1】:

正确的语法可能如下...

for File in "${data_dir}2017*_${i}.csv"
do
# some commands...
done

您只需引用孔文件,bash 将处理通配符*, 我还添加了花括号 { } 以将变量与其他变量分开。

【讨论】:

  • 老实说,我不明白这如何解决 OP 的问题,例如我只想遍历原始文件 - 但他接受了 - 所以......我不能理解所有内容。 ;)
  • 也许我不清楚:我担心的是我不希望迭代器检查我在运行时创建的中间文件(苏莱曼回答的 # some commands 部分发生了什么),但是坚持原来的,以“2017”开头的那些。这个方法做我想要的。
  • @suleiman:为什么引用包括通配符在内的整个表达式可以解决问题?我期望相反。例如,如果我执行for f in "$HOME"/*,循环体会为我的 HOME 中的每个非隐藏条目调用一次,但是当我执行for f in "$HOME/*" 时,循环体只会调用一次,因为引号抑制了全局字符。
  • 这就是我使用花括号的原因。引用变量或在这种情况下引用文件总是更好。如果没有引号和花括号,则 sript 的行为会有所不同
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
相关资源
最近更新 更多