Existe um - eu considero um software legal chamado perl-rename
no qual você pode fazer sua tarefa tão simples quanto:
perl-rename 's/^(.*)_.*AUG2014.*/AZ-2014-08-$1.pdf/' *.pdf
HTH, elogios,
Eu tenho vários arquivos cujos nomes se parecem com isso
2313_ABCDEAUG2014_PQRST_0_.pdf
3244_ABCDEAUG2014_PQRST_0_.pdf
4234_ABCDEAUG2014_PQRST_0_.pdf
t deseja renomear o arquivo no seguinte formato.
AZ-2014-08-2313.pdf
AZ-2014-08-3244.pdf
Por favor, sugira.
Existe um - eu considero um software legal chamado perl-rename
no qual você pode fazer sua tarefa tão simples quanto:
perl-rename 's/^(.*)_.*AUG2014.*/AZ-2014-08-$1.pdf/' *.pdf
HTH, elogios,
Se os nomes dos arquivos não contiverem aspas simples ou caracteres de nova linha:
ls | sed -n "s/$/:JAN1FEB2MAR3APR4MAY5JUN6JUL7AUG8SEP9OCT10NOV11DEC12/
s/\(\(.*\)_.*\(...\)\([0-9]\{4\}\)_.*\):.*\([0-9]*\).*/mv -i -- '' 'AZ---.pdf'/p"
Adicione | sh
para fazer a renomeação.
Isso está usando um truque comum de sed
para fazer alguma tradução (aqui AUG
- > 8
).
Acrescentamos a tabela de mapeamento (aqui JAN1FEB2...
) ao final do espaço de padrão e contamos com referências anteriores ( \(...\).*\([0-9]*\)
) para fazer a pesquisa. Estamos capturando o AUG
em e obtendo (em
a sequência de dígitos que segue esse
na tabela de mapeamento.
Os itens a seguir passarão por todos os arquivos pdf e serão copiados para o novo formato de nome, deixando os arquivos originais no lugar para que você possa verificar se está como você deseja.
for file in $(ls *AUG2014*pdf) ; do newName=$(echo $file | awk -F_ '{ print $1 }') ; cp $file AZ-2014-08-$newName.pdf ; done
ls *AUG2014*pdf
- lista todos os arquivos contendo agosto de 2014, terminando em pdf
for aString in <list> ; do someCommand $aString ; done
- percorre todos os elementos em uma lista, com cada um referenciado como aString. Referenciando o aString usando o símbolo do dólar $ antes da mão.
awk -F_
- divide a string em tokens conforme o divisor "_". O comando acima imprime o primeiro token.
Tenha cuidado para que não haja vários arquivos começando com o mesmo número. Se houver, dois arquivos podem ser copiados para o mesmo nome de arquivo, um sobrescrevendo o outro. Verifique o número de arquivos antigos em relação ao número de novos arquivos.
Bem, eis o que fiz com o GNU tar
:
mkdir test; cd test
eval "set -- $(i=
for m in JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
do touch 2313_ABCDE${m}2014_PQRST_0_.pdf \
3244_ABCDE${m}2014_PQRST_0_.pdf \
4234_ABCDE${m}2014_PQRST_0_.pdf
printf " %s's/\([0-9]*\)_.*$m\(20..\)_.*\./AZ-\\2-%02d-\\1./'" \
--xform= $((i=$i+1))
done)"
mkdir -p ../new
tar -c . "$@" | tar -C../new -x
Você obviamente não precisaria das partes mkdir test
ou touch ..\..\..
, mas as fiz para poder verificar essa resposta. Você pode ver os resultados desses dois aqui:
ls -m
2313_ABCDEAPR2014_PQRST_0_.pdf, 2313_ABCDEAUG2014_PQRST_0_.pdf,
2313_ABCDEDEC2014_PQRST_0_.pdf, 2313_ABCDEFEB2014_PQRST_0_.pdf,
2313_ABCDEJAN2014_PQRST_0_.pdf, 2313_ABCDEJUL2014_PQRST_0_.pdf,
2313_ABCDEJUN2014_PQRST_0_.pdf, 2313_ABCDEMAR2014_PQRST_0_.pdf,
2313_ABCDEMAY2014_PQRST_0_.pdf, 2313_ABCDENOV2014_PQRST_0_.pdf,
2313_ABCDEOCT2014_PQRST_0_.pdf, 2313_ABCDESEP2014_PQRST_0_.pdf,
3244_ABCDEAPR2014_PQRST_0_.pdf, 3244_ABCDEAUG2014_PQRST_0_.pdf,
#...and so on
Mas também há ...
ls -m ../new
AZ-2014-01-2313.pdf, AZ-2014-01-3244.pdf, AZ-2014-01-4234.pdf,
AZ-2014-02-2313.pdf, AZ-2014-02-3244.pdf, AZ-2014-02-4234.pdf,
AZ-2014-03-2313.pdf, AZ-2014-03-3244.pdf, AZ-2014-03-4234.pdf,
AZ-2014-04-2313.pdf, AZ-2014-04-3244.pdf, AZ-2014-04-4234.pdf,
AZ-2014-05-2313.pdf, AZ-2014-05-3244.pdf, AZ-2014-05-4234.pdf,
AZ-2014-06-2313.pdf, AZ-2014-06-3244.pdf, AZ-2014-06-4234.pdf,
AZ-2014-07-2313.pdf, AZ-2014-07-3244.pdf, AZ-2014-07-4234.pdf,
AZ-2014-08-2313.pdf, AZ-2014-08-3244.pdf, AZ-2014-08-4234.pdf,
AZ-2014-09-2313.pdf, AZ-2014-09-3244.pdf, AZ-2014-09-4234.pdf,
AZ-2014-10-2313.pdf, AZ-2014-10-3244.pdf, AZ-2014-10-4234.pdf,
AZ-2014-11-2313.pdf, AZ-2014-11-3244.pdf, AZ-2014-11-4234.pdf,
AZ-2014-12-2313.pdf, AZ-2014-12-3244.pdf, AZ-2014-12-4234.pdf
Como você pode ver, ele mudou todos os arquivos criados para suas especificações. Agora, tendo feito isso, estou satisfeito e assim farei:
rm *; mv ../new/* ./; rmdir ../new
E é isso.
filelist='2313_ABCDEAUG2014_PQRST_0_.pdf 3244_ABCDEAUG2014_PQRST_0_.pdf 4234_ABCDEAUG2014_PQRST_0_.pdf'
for i in $filelist; do
id=$(echo $i|awk -F_ '{print $1}');
mv $i AZ-2014-08-$newname.pdf;
done
Você pode ter um ano ou mês diferente. Se for esse o caso, você precisa extrair as outras partes do nome que deseja manter para criar o novo nome.
Tags rename