Renomear arquivo em lote usando o arquivo de mapeamento

3

Eu tenho uma grande coleção de arquivos de imagem, por exemplo:

a.png, b.png, c.png, etc

Se eu tiver um arquivo com mapeamentos de nomes de arquivos para números, assim (ignore o formato, pode ser qualquer coisa):

a=>1
b=>2
c=>3
...

Existe alguma maneira fácil de renomear todos os arquivos usando o arquivo de mapeamento para:

1.png, 2.png, 3.png, etc

Estou procurando comandos unix / linux. Eu sei que posso escrever um script muito simples, mas apenas curioso se houver alguma outra técnica.

Obrigado

    
por Steve 28.04.2011 / 19:25

3 respostas

5

Não existe um único comando para tudo ; esse é o objetivo de ter um shell com script.

while read -r old new; do
    mv "$old.png" "$new.png"
done < map.txt
    
por 28.04.2011 / 19:45
2

Sem sed, você pode fazer substituições como esta no bash:

for line in  $(< patterns) ; do  echo "Pattern: " $line " char: "  ${line/=>*/} " nr: " ${line/*=>/}; done 

('padrões' seria o arquivo com um = > 1 e assim por diante) que leva a:

for line in  $(< patterns) ; do
  c=${line/=>*/}
  n=${line/*=>/}
  mv $c.png $n.png 
done 

A manpage do bash lista essa e outras opções interessantes sob 'substituição de string'.

Talvez perls rename seja uma opção interessante também. Permite renomeação em massa com padrões, como

rename 's/^a/1/' a*png 

No Ubuntu, ele vem com o pacote perl, afaik.

    
por 28.04.2011 / 19:47
0

Este é um caminho com o perl:

cat mapfile | perl -e 'my$h={eval join(",",<>)};while (($k,$v)=each%$h){'mv $k.png $v.png'}'

Segunda tentativa:

perl -nle '(@a=map{s/^\s+//;s/\s+$//;s/'/\'/g;$_}split/\s*=>\s*/,$_,2)and'mv \'$a[0].png\' \'$a[1].png\'''

Funciona com:

Someone's $tupid file name    =>   renamed by "simple" script?!
    
por 28.04.2011 / 19:46