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
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
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
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.
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?!