[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"
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Renomear multiplos arquivos,
Tiago Barcellos Peczenyj <=