如何从......到打印文件名

时间:2015-11-25 13:59:05

标签: linux bash for-loop

我必须从文件列表中打印指定文件的内容,如下所示。开头文件名中的日期是可更改的,而部分" _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

我想从粉丝"来自"打印fles的内容。 "至"和#34;来自"和"到"是变量的(由用户定义,具体取决于需求):

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`

但结果是相似的。

你可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

如果您希望循环显示指定的月份和日期,则可以使用{..}语法。为什么?因为即使在检查变量之前也会发生这种扩展,因此不能在那里存储任何变量。

相反,请使用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

答案 1 :(得分:1)

嗯,你可以试试

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

完成不适用于' - '包括在内,因为bash不会将其识别为整数。