【问题标题】:How to print files name from... to如何打印文件名从...到
【发布时间】:2015-11-25 13:59:05
【问题描述】:

我必须从下面的文件列表中打印指定文件的内容。起始文件名中的日期是可变的,“_lol_lol.txt”部分是常量。

ls
2015-01-03_lol_lol.txt
2015-01-24_lol_lol.txt
...
2015-10-23_lol_lol.txt
2015-10-24_lol_lol.txt
...
2015-11-14_lol_lol.txt 
2015-11-15_lol_lol.txt 
2015-11-16_lol_lol.txt 
2015-11-17_lol_lol.txt 
2015-11-18_lol_lol.txt 
2015-11-19_lol_lol.txt
2015-11-20_lol_lol.txt 
2015-11-21_lol_lol.txt 
2015-11-22_lol_lol.txt 
2015-11-23_lol_lol.txt 
2015-11-24_lol_lol.txt 
2015-11-25_lol_lol.txt

每个文件都包含一些数据,为了区分大小写:

cat 2015-01-03_lol_lol.txt
2015-01-03
cat 2015-01-24_lol_lol.txt
2015-01-24
...
cat 2015-10-23_lol_lol.txt
2015-10-23
cat 2015-10-24_lol_lol.txt
2015-10-24
...
cat 2015-11-14_lol_lol.txt
2015-11-14
cat 2015-11-15_lol_lol.txt
2015-11-15
...
cat 2015-11-25_lol_lol.txt
2015-11-25

我想从 fange "from" "to" 打印文件的内容,并且 "from" 和 "to" 都是可变的(由用户定义,取决于需要):

2015-11-15_lol_lol.txt
2015-11-16_lol_lol.txt 
2015-11-17_lol_lol.txt

预期结果:

2015-11-15
2015-11-16
2015-11-17

但是当我使用命令时:

for i in {"2015-11-15".."2015-11-17"};do echo  $i_lol_lol.txt ;done

Bash 返回:

{2015-11-15..2015-11-17}.txt

因为像@karoshi 一样,如果我使用“-”,整个表达式就像字符串一样被识别。

我试过了:

y1=2015;
y2=2015;
m1=11;
m2=11;
d=15
z=17

#for i in {${y1}..${y2}}; do
   for j in {${m1}..${m2}}; do
           for k in {${d1}..${d2}}; do
                   cat ${i}-${j}-${k}_lol_lol.txt
           done
   done
done`

但结果是相似的。

你能帮忙吗?

【问题讨论】:

  • 您需要在这里支持什么样的范围?如果范围内的给定文件不存在怎么办?
  • 如果你想打印内容文件,你可能想说cat,而不是echo
  • @fedorqui 你是对的。我想使用cat 而不是echo。 @Etan Reisner 范围是全年。

标签: linux bash for-loop


【解决方案1】:

如果您想遍历给定的月份和日期,可以使用{..} 语法。为什么?因为这种扩展甚至在变量被检查之前就发生了,所以没有变量可以存储在那里。

改为使用seq,它确实允许变量。

$ a=12
$ b=23
$ for i in $(seq $a $b); do echo "$i"; done
12
13
...
21
22
23

在这种情况下,你可能想说:

  • 获取$min_month$max_month
  • 获取$min_day$max_day

然后执行双循环:

for month in $(seq "$min_month" "$max_month");
do
    for day in $(seq "$min_day""$max_day");
    do
         cat 2015-${month}-${day}_lol_lol.txt
    done
done

【讨论】:

  • 甚至不需要做那么多,for i in 2015-11-1{5,6,7}_lol_lol.txt;do echo $i;done
  • 此数据范围仅为示例。因为在这种情况下,我必须 cat 日期从 11-15 到 11-17 但是两天我必须 cat 日期从 11-17 到 11-19。
  • @DamianSilkowski 然后请用更详细的示例更新您的问题!
  • @fedorqui 完成。我希望我的描述对你来说已经足够了。
  • @DamianSilkowski 最好更新解释它的逻辑(“我想打印名称包含 X 和 Y 的那些”),而不是粘贴它们的完整列表。你能编辑并显示它吗?
【解决方案2】:

嗯,你可以试试

for i in {15..17};do echo  2015-11-${i}_lol_lol.txt ;done

补全不适用于包含的“-”,因为 bash 无法将其识别为整数。

【讨论】:

  • 所以我必须将日期格式从 2015-11-15 更改为 2015.11.15。但是,如果月份发生变化,即我将不得不 cat 从 2015-11-29 到 2015-12-03 的文件,会发生什么?
猜你喜欢
  • 2019-11-05
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多