Renomeie vários arquivos no unix

5

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.

    
por Nikhil Taralkar 03.09.2014 / 11:30

5 respostas

5

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,

    
por 03.09.2014 / 22:24
2

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.

    
por 03.09.2014 / 11:51
1

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.

    
por 03.09.2014 / 11:42
0

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.

    
por 03.09.2014 / 22:10
0
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.

    
por 03.09.2014 / 12:02

Tags