Intereting Posts
Удаление программного обеспечения, построенного на основе Source Что происходит, когда вы выполняете функцию, которая вызывает другую функцию? Можно ли переименовать файл Xubuntu без XFCE? Несколько экранов на одном физическом мониторе Уведомление о предупреждениях Nagios отсутствует Как превратить локальный репозиторий yum в локальный спутник для многих других репозиториев Mount EXT3 с блоками 16 КБ Как я могу безопасно подключиться к своему ящику Linux через Интернет? Как отправить уведомление о предупреждении, когда процесс убит убийцей OOM? LiveUSB застрял после «зондирования EDD» во время загрузки скажите, была ли последняя команда пуста в PROMPT_COMMAND Whonix – whonix-gw продолжает говорить, что условие начала не выполнено Как правильно отображать китайские символы на Chromium Дисплей сна: графическая карта «сон»? Указание исходящего интерфейса для туннеля SSH

Необходимо получить последний файл с меткой даты за каждый месяц

Я только начинаю с программирования 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 

В приведенном выше случае для этого года, комбинации месяца и даты мне нужно получить последний файл.

На выдержке вы дали:

 ls -r | POSIXLY_CORRECT=1 awk ' match($0,"20[0-9]{6}") && !n[substr($0,RSTART,6)]++' 

должно сработать. POSIXLY_CORRECT=1 требуется только с GNU awk который не распознает {6} противном случае (это не вредит другим реализациям awk ).

С sort GNU, который гарантирует стабильный вид,

 ls -r | sort -ut_ -k 5,5.6 

также будет работать (ожидается дата в 5-м поле).

Если вы знаете, что вас интересуют только месяцы одного или двух лет (например, 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