我刚刚开始 Unix 编程,我有一个要求。我有四个文件放置在我的着陆区中,我需要调度程序来获取该月和该年的最新文件。
例如:
FILE_NR_WEEKLY_01_20130528_CHARGE
FILE_NR_WEEKLY_01_20130530_CHARGE--> This needs to be picked 1st for may month
FILE_NR_WEEKLY_01_20130601_CHARGE
FILE_NR_WEEKLY_01_20130604_CHARGE -->This needs to be picked up for June month
在上述年份、月份和日期组合的情况下,我需要获取最新的文件。
答案1
在你给出的摘录中,这个:
ls -r | POSIXLY_CORRECT=1 awk '
match($0,"20[0-9]{6}") && !n[substr($0,RSTART,6)]++'
会工作。POSIXLY_CORRECT=1
只有 GNU 才需要它awk
,否则它不会识别{6}
其他的(它不会对其他awk
实现造成损害)。
GNUsort
保证了稳定的种类,
ls -r | sort -ut_ -k 5,5.6
也可以(预计第五字段中的日期)。
答案2
如果您知道您只对一年或两年中的几个月(例如 2012 年和 2013 年)感兴趣,并且如果您知道最近一个月的文件比前几个月的文件更新(我的意思是如果创建了一月份的文件前二月的文件等),然后您可以使用文件的时间戳来查找每年和每月的最新文件,只需按日期对文件进行排序 ( ls -tr
) 并选择最后一个文件 ( tail -n 1
):
for year in 2012 2013; do for month in {1..12}; do
file=`ls -tr *$year*$month??_* | tail -n 1` &&
if [ -f "$file" ]; then echo "$year/$month $file";fi;
done;done 2>/dev/null
如果您无法知道“最新”文件也是最新的,则必须解析它们的名称:
find . -type f | perl -ne 'chomp; /_(\d{4})(\d{2})(\d{2})_/;
$newest{$1}{$2}=$_ if $3>$newest{$1}{$2};
END{
foreach $year (keys(%newest)){
foreach $month (keys %{$newest{$year}}){
print "$year/$month\t$newest{$year}{$month}\n"
} } }' | sort