renomear arquivos com SED

24 views
Skip to first unread message

"Flávio R. Lopes"

unread,
Nov 26, 2009, 3:05:44 PM11/26/09
to Lista SLACK USERS
Boa tarde galera!

Seguinte:
Tenho vários diretórios onde são gerados alguns arquivos, onde o padrão
deles é que terminam com a extensão ".txt", por exemplo:

banana.txt
ventilador.txt
regua.txt
arquivocomnomegrande.txt

e por aí vai.

gostaria na verdade de alguma rotina com o SED (que agisse de forma
recurssiva nos diretorios que eu indicar) que somente tirasse as
extensões deles, sem alterar seu conteudo, ou seja:

banana.txt ficaria banana
ventilador.txt ficaria ventilador
regua.txt ficaria regua
arquivocomnomegrande.txt ficaria arquivocomnomegrande

em resumo, seria a mesma coisa que eu fizesse manualmente o seguinte:

mv banana.txt banana
mv ventilador.txt ventilador
mv regua.txt regua
mv arquivocomnomegrande.txt arquivocomnomegrande


Como posso fazer isso?

abraço,
Flávio

Cesar Suga

unread,
Nov 26, 2009, 4:37:09 PM11/26/09
to slack-u...@googlegroups.com

for a in *.txt; do
  NAME=`echo ${a} | sed s/.txt$//`
  echo ${NAME} # imprimira "banana" de um "banana.txt"

  mv $a ${NAME} # mv banana.txt banana  
done


... e etc :)


2009/11/26 "Flávio R. Lopes" <flavio...@paradoxo.inf.br>



--
Cesar Suga <sar...@gmail.com>

Daniel Bauermann

unread,
Nov 26, 2009, 8:09:02 PM11/26/09
to slack-u...@googlegroups.com
> for a in *.txt; do
>   NAME=`echo ${a} | sed s/.txt$//`

Aqui poderia utilizar também o comando "basename":

NAME=`basename ${a} .txt`

>   echo ${NAME} # imprimira "banana" de um "banana.txt"
>   mv $a ${NAME} # mv banana.txt banana
> done

No mais poderia utilizar a mesma lógica...

Apenas não tens a recursividade.

Neste caso eu substituiria o "for" por um "find":

find /CAMINHO_INICIAL_DE_PROCURA -name "*.txt" -exec mv {} `echo {} |
sed -e 's/.txt$//g' \;

Explicando:

find = comando de procura
/CAMINHO_INICIAL_DE_PROCURA = diretório onde iniciaremos a procura
-name "*.txt" = filtro para buscar somente arquivos que terminem com a
extensão .txt
-exec = executa um comando (o comando fica entre o exec e o sinal de
finalizaçao: o "\;")

Não entrarei em detalhes do comando, mas qualquer dúvida entre em contato.

Daniel.

Cesar Suga

unread,
Nov 26, 2009, 8:22:32 PM11/26/09
to slack-u...@googlegroups.com
Ah, é! Sempre me esqueço do basename... 

2009/11/26 Daniel Bauermann <dbli...@gmail.com>



--
Cesar Suga <sar...@gmail.com>

André Geraldo Vieira

unread,
Nov 26, 2009, 7:20:03 PM11/26/09
to slack-u...@googlegroups.com
2009/11/26 Cesar Suga <sar...@gmail.com>


for a in *.txt; do
  NAME=`echo ${a} | sed s/.txt$//`
  echo ${NAME} # imprimira "banana" de um "banana.txt"

  mv $a ${NAME} # mv banana.txt banana  
done


... e etc :)

Uma pequena melhoria, agora o script é recursivo.

for ARQ in $(find -name '*.txt' -print); do
    NOVO=`echo $ARQ | sed s/.txt$//`
    mv $ARQ $NOVO
done




--
Diga não a Exclusão Digital!!
Valorize o Código Aberto!!
Incentive  o Software Livre!!
Não Seja Pirata, Seja Livre!!

Por que GNU/Linux?
"Somente pelo Prazer de ser LIVRE..."

  |_|0|_|
  |_|_|0|
  |0|0|0|

André Geraldo Vieira
Brasília - DF

Usuário Linux Nº #335012
(Linux Counter, http://counter.li.org.)
Reply all
Reply to author
Forward
0 new messages