需要获取每个月带有日期时间戳的最新文件

需要获取每个月带有日期时间戳的最新文件

我刚刚开始 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

相关内容