2

我想生成一个名称包含的文件列表,${filename}.${date}例如file.20111101file.20120703November 1, 2011今天开始,它应该不包括周末。

谢谢。

4

4 回答 4

5

2011 年试试这个

for y in 2011; do
  for m in {1..12}; do
    for d in  `cal -m $m $y|tail -n +3|cut -c 1-15`; do
      printf "file.%04d%02d%02d\n" $y $m $d;
    done;
  done;
done

或者这个适用于 2011 年 11 月到 2013 年 12 月

for ym in {2011' '{11,12},{2012..2013}' '{1..12}}; do
  read y m <<<$ym;
  for d in  `cal -m $m $y|tail -n +3|cut -c 1-15`; do
    printf "file.%04d%02d%02d\n" $y $m $d;
  done;
done

或直到本月底“艰难”

for ym in {2011' '{11,12},2012' '{1..7}};do
  read y m <<<$ym;
  for d in  `cal -m $m $y|tail -n +3|cut -c 1-15`;do
    printf "file.%04d%02d%02d\n" $y $m $d;
  done;
done
于 2012-07-03T15:36:20.233 回答
2

这可能对你有用(GNU date、sed 和 Bash):

seq 0 $((($(date +%s)-$(date -d 20111101 +%s))/86400)) |
sed '5~7d;6~7d' |
xargs -l1 -I '{}' date -d '+{} days 20111101' +file.%Y%m%d

解释:

  • seq提供从20111101到的天数today
  • sed过滤掉周末
  • xargsdate为命令提供日期参数。
于 2012-07-04T10:35:26.097 回答
1

另一种选择是使用dateseq( dateutilshttp://www.fresse.org/dateutils/#dateseq )

$ dateseq 2017-03-25 $(date +%F) --skip sat,sun -ffile.%Y%m%d
file.20170327
file.20170328
file.20170329
file.20170330
file.20170331
file.20170403
file.20170404
file.20170405
file.20170406
file.20170407
于 2017-04-08T03:02:08.160 回答
0

gawk 的解决方案:

gawk -v START_DATE="2011 11 01 0 0 0" -v FILE="file" '
  BEGIN {

    END_DATE   = strftime( "%Y %m %d 0 0 0", systime() )

    while ( START_DATE <= END_DATE ) {
      split( START_DATE, DATE )
      if ( strftime( "%u", mktime( START_DATE ) ) < 6 ) print FILE "." DATE[ 1 ] DATE[ 2 ] DATE[ 3 ]
      START_DATE = strftime( "%Y %m %d 0 0 0", mktime( DATE[ 1 ] " " DATE[ 2 ] " " ( DATE[ 3 ]+1 ) " 0 0 0" ) )
    }

  }
'

这使用了mktime的一个很好的属性,当您增加一个日期组件(例如,“2012-02-33”变为“2012-03-04”)时,它会自动找到正确的日期。

于 2012-07-15T09:55:08.530 回答