Bem, se as strings de data estiverem nos nomes dos arquivos e todos os arquivos estiverem no mesmo diretório, você poderia fazer:
mv 201601*.txt 2016/January
Fazer isso 12 vezes manualmente seria uma dor, então eu criaria uma lista com o número e o nome do mês correspondente:
$ 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
Em seguida, analise-o para criar os comandos 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
Quando tiver certeza de que faz o que precisa, remova o echo
para realmente mover os arquivos:
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
Explicação
O grep -Po '\s+\K[A-Z]\w{2,}')
executará grep
com expressões regulares compatíveis com Perl ( -P
) e imprimirá apenas a (s) parte (s) correspondente (s) de cada linha ( -o
). A expressão regular usada procurará por um ou mais caracteres de espaço em branco ( \s+
) seguidos por uma letra maiúscula ( [A-Z]
) e 2 ou mais caracteres de palavra ( \w{2,}
). O \K
significa "ignorar tudo antes disso", o que fará com que o comando apenas imprima a parte das sequências correspondentes após o espaço em branco. A coisa toda simplesmente imprime a lista de meses.