说我有文件说像
AA_XX_20111208
AA_XX_20111207
AA_XX_20111206
AA_XX_20111205
AA_XX_20111204
AA_XX_20111203
那么使用日期部分,我如何获取之前 2 个月的文件?
例如,本月是二月,我必须获取与一月和十二月相关的所有文件。对于三月,我必须获取一月和二月的文件这必须每个月发生。
例如。对于二月份,我需要十二月和一月的文件
AA_XX_20121208
AA_XX_20121207
AA_XX_20121206
...很快
AA_XX_20130108
AA_XX_20130107
AA_XX_20130106
...很快
答案1
假设您有 GNU 日期,此函数将为您提供过去 2 个月的所有日期:
dates_in_previous_two_months () {
for month_delta in 0 1; do
# get the last day of a previous month
day=$(date -d "$(date +%Y-%m-01) -$month_delta month -1 day" +%Y%m%d)
until [[ $day == *00 ]]; do
echo $day
((day--))
done
done
}
对于 2013 年 2 月中的任意一天,将返回:
20130131
20130130
20130129
[... and so on until ...]
20121203
20121202
20121201
三月它将返回日期从20130228
到20130101
你可以这样使用它:
for date in $(dates_in_previous_two_months); do
"fetch" AA_XX_$date
done
或者
dates_in_previous_two_months | xargs -I{} "fetch" AA_XX_{}
答案2
您可以使用find
命令。以下命令将列出过去 60 天内修改的所有文件
find . -name 'AA_XX_*' -mtime -60
这是用于实现您想要的功能的 shell 脚本,但我同意这不是一个干净的解决方案。我本人不喜欢这种笨拙的代码,但暂时它会对你有用
#!/usr/local/bin/bash
YEAR=`date +%Y`
MONTH=`date +%m`
DATE=`date +%d`
if [ $MONTH = 01 ]; then
OLDEST=`expr $YEAR - 1`11010000
NEWEST=`expr $YEAR - 1`12312359
elif [ $MONTH = 02 ]; then
OLDEST=`expr $YEAR - 1`12010000
echo $YEAR
NEWEST="$YEAR"01312359
else
case $MONTH in
03)
OLDEST=$YEAR0`expr $MONTH - 2`010000
if [ $YEAR%4 = 0 ]; then
DATE=29
else
DATE=28
fi
NEWEST=$YEAR0`expr $MONTH - 1`"$DATE"2359;;
04|06|09|11)
OLDEST=$YEAR0`expr $MONTH - 2`010000
NEWEST=$YEAR0`expr $MONTH - 1`312359;;
07|08|10|12)
OLDEST=$YEAR0`expr $MONTH - 2`010000
NEWEST=$YEAR0`expr $MONTH - 1`302359;;
esac
fi
echo $OLDEST
echo $NEWEST
touch -t $OLDEST oldest
touch -t $NEWEST newest
find . -name 'AA_XX_*' -newer oldest ! -newer newest > temp.txt
答案3
像这样?
cp source/AA_XX_$(date -d "2 months ago" +%04Y%02m)* source/AA_XX_$(date -d "1 month ago" +%04Y%02m)* destination/
答案4
本月加上年份是$(date +%Y%m)
。上个月是previous_month_1=$(date -d '1 month ago' +%Y%m)
GNU 日期(即在非嵌入式 Linux 或 Cygwin 上),上个月是previous_month_2=$(date -d '2 months ago' +%Y%m)
.在其他实现中,它们由下式给出
this_month=$(date +%Y%m)
case $this_month in
*01) previous_month_1=$((this_month-89)); previous_month_2=$((previous_month-1));;
*02) previous_month_1=$((this_month-1)); previous_month_2=$((previous_month-89));;
*) previous_month_1=$((this_month-1)); previous_month_2=$((previous_month-1));;
esac
现在,要匹配前两个月的所有现有文件:
fetch "AA_XX_$previous_month_1"?? "AA_XX_$previous_month_2"??
(替换fetch
为您要在这些文件上运行的命令。)如果一个月可能没有匹配的文件,则模式将保持不变:
filter_month () {
case $1 in *'??') return;; esac
fetch "$@"
}
filter_month "$previous_month_1"??
filter_month "$previous_month_2"??
如果您想获取与该月的日期相对应的所有文件,您将需要一些 GNU 日期魔法(此处未描述)或一些闰年逻辑。
filter_month () {
case $1 in
*0[13578]|*1[02]) n=31;;
*0[469]|*11) n=30;;
*0002) if [ $((${1%????} %4)) -eq 0 ]; then n=29; else n=28; fi;;
*02) if [ $((${1%??} %4)) -eq 0 ]; then n=29; else n=28; fi;;
esac
while [ $n -gt 0 ]; do
d=$n
if [ $d -lt 10 ]; then d=0$d; fi
fetch "AA_XX_$1$d"
fi
}
filter_month "$previous_month_1"
filter_month "$previous_month_2"