shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Renomear multiplos arquivos


From: Tiago Barcellos Peczenyj
Subject: Renomear multiplos arquivos
Date: Fri, 22 Feb 2008 19:36:19 -0300

O site Dicas-L trouxe na ultima semana 2 formas de renomear multiplos
arquivos (http://www.dicas-l.com.br/dicas-l/20080219.php e
http://www.dicas-l.com.br/dicas-l/20080221.php)

#Forma 1
for o in $(ls -1 *.txt); do
  mv $o $(echo $o | awk -F. '{print $1".htm"}');
done

#Forma 2
for i in `ls *.txt`; do
  mv $i $(echo `basename $i .txt`.html)
done

São ambas formas interessantes, porém ao meu ver consomem muito
recursos da maquina, sem falar que são um tanto... feios... (nada
contra - o que importa é que funcione)

Vou utiliza-los como exemplo de como podemos tornar algo melhor e mais
prático (se o tempo permitir).

Vamos dividir as paradas:

altera() { mv $1 $(echo `basename $1 .txt`.html) ;}

for i in `ls *.txt`; do
  altera $i
done

Agora vamos tomar um cuidado: arquivos com espaço no nome

altera() { mv "$1" $(echo `basename "$1" .txt`.html) ;}

for i in `ls *.txt`; do
  altera "${i}"
done

Bom, o for pode iterar sobre uma lista de argumentos. As mascaras de
nome de arquivo são expandidos pelo shell durante a execução, logo...

for i in *.txt ; do
  altera "${i}"
done

Agora, a rotina de alteração do nome do arquivo de destino é
complicadissima, depende de um ou mais sub-processos. Isso poderia
ser...

altera() { mv "$1" "${1%.txt}.html" ;}

Que, inserido no for...

for i in *.txt ; do
  mv "${i}" "${i%.txt}.html"
done

Interessante, certo? Nenhum sub-processo, exceto o inumeros mv que
serão executados. Existem outras formas de fazer a mesma coisa

ls *.txt | awk -F. -v OFS=. '{ O=$0; $NF="html" ;printf "\"%s\"
\"%s\"\n",O,$0 }' | xargs -n 2 mv

ls *.txt | sed 's#^\(.\+\)\.[^.]\+$#"&" "\1.html"#g' | xargs -n 2 mv

(rodem as linhas acima sem o mv do xargs para entende-las -- é metaprogramação)

Agora... tudo isso é muito bonito mas... veja se o seu computador
possui os comandos mmv ou rename (que facilitam Absurdamente a tarefa)

rename .txt .html *.txt

mmv "*.txt" "#1.html"

Simples, não?

Tudo depende do tempo que temos e das nossas necessidades. Mesmo que o
rename/mmv sejam uteis, pode ser que a forma com awk / sed valha  mais
a pena pois o ls pode ser substituido por um find (ja pensaram nisso?)

Espero que seja util
-- 
Tiago B Peczenyj
Linux User #405772

http://peczenyj.blogspot.com/
"what does not kill us makes us stronger"


reply via email to

[Prev in Thread] Current Thread [Next in Thread]