Что ж, если строки даты находятся в именах файлов и все файлы находятся в одном каталоге, вы можете сделать:
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
означает «игнорировать все до этого», что приведет к тому, что команда будет печатать только часть совпадающих строк после пробела. Все это просто распечатывает список месяцев.