Pretty tail -f для файлов журнала [дубликат]

Что ж, если строки даты находятся в именах файлов и все файлы находятся в одном каталоге, вы можете сделать:

mv 201601*.txt 2016/January

Выполнить это 12 раз вручную было бы сложно. , поэтому я бы создал список с номером и соответствующим названием месяца:

$ paste <(printf '%s\n' {01..12}) <(cal 2016 | grep -Po '\s+\K[A-Z]\w{2,}') 
01  January
02  February
03  March
04  April
05  May
06  June
07  July
08  August
09  September
10  October
11  November
12  December

А затем проанализирую его, чтобы создать команды mv :

$ paste <(printf '%s\n' {01..12}) <(cal 2016 | grep -Po '\s+\K[A-Z]\w{2,}') | 
    while read num month; do echo mv "*2016$num*" 2016/"$month"; done
mv *201601* 2016/January
mv *201602* 2016/February
mv *201603* 2016/March
mv *201604* 2016/April
mv *201605* 2016/May
mv *201606* 2016/June
mv *201607* 2016/July
mv *201608* 2016/August
mv *201609* 2016/September
mv *201610* 2016/October
mv *201611* 2016/November
mv *201612* 2016/December

Как только вы убедитесь, что это делает то, что вам нужно, удалите echo для фактического перемещения файлов:

paste <(printf '%s\n' {01..12}) <(cal 2016 | grep -Po '\s+\K[A-Z]\w{2,}') | 
    while read num month; do echo mv "*2016$num*" 2016/"$month"; done

Объяснение

grep -Po '\ s + \ K [AZ] \ w {2,}') запустит ] grep с Perl-совместимыми регулярными выражениями ( -P ) и будет печатать только совпадающие части каждой строки ( -o ). Используемое регулярное выражение будет искать один или несколько символов пробела ( \ s + ), за которыми следует заглавная буква ( [AZ] ) и 2 или более символа слова ( \ w {2,} ). \ K означает «игнорировать все до этого», что приведет к тому, что команда будет печатать только часть совпадающих строк после пробела. Все это просто распечатывает список месяцев.

298
16.03.2011, 23:51
0 ответов

Теги

Похожие вопросы