[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Re: Renomear arquivos em cadeia em um diretório
From: |
Fábio Batista |
Subject: |
Re: [shell-script] Re: Renomear arquivos em cadeia em um diretório |
Date: |
Wed, 19 Jan 2005 19:23:59 -0300 |
Pô, depois desse texto todo, apenas um "Obrigado"?
Quero ouvir comentários :)
Fábio David Batista
address@hidden
http://nerd-o-matic.blogspot.com
On Wed, 19 Jan 2005 19:17:15 -0000, oteb_04 <address@hidden> wrote:
>
> Obrigado
>
> []
> Beto
>
>
>
>
> --- Em address@hidden, Fábio Batista
> <fabio.david.batista@g...> escreveu
> > Claro.
> >
> > O principal pra chegar em linhas de comando menores e evitar os FOR e
> > excesso de pipes da vida é conhecer a fundo o que fazem os principais
> > comandos do shell, principalmente os mais complicados e cheios de
> > funcionalidade, como o SED e o FIND - meus preferidos.
> >
> > Uma coisa que pode-se pensar também, às vezes, é em "gerar um novo
> > script". É o que essa solução que eu enviei faz: ela não chama o
> > comando MV várias vezes - ao invés disso, ela gera um script que é
> > executado em um subshell, através do pipe com o SH.
> >
> > Agora, explicando essa solução: ao ler o enunciado, percebi que todas
> > as transformações que o nosso amigo EOAC precisava realizar nos nomes
> > de arquivo podiam ser realizadas por um único comando SED. Então parti
> > pra essa solução, e cheguei ao resultado dos nomes de arquivo que ele
> > queria.
> >
> > Então, incrementei um pouco mais o SED para ele gerar os comandos MV
> > necessários para renomear os arquivos. O comando do SED ficou, então,
> > assim:
> >
> > # padrão p/ busca (espaços adicionados p/ fins de clareza):
> > ( [0-9]{3} _ ) ( .* )
> > # captura dois grupos:
> > # grupo 1: três números seguidos de um underscore
> > # grupo 2: o restante da string
> >
> > # substituição:
> > mv \0 \L\2
> > # 'mv ': escreve 'mv'
> > # '\0 ' escreve a string inteira capturada (grupo zero), ou seja, o
> > nome do arquivo inteiro
> > # '\L': converte os próximos caracteres em minúsculas (comando do SED)
> > # '\2': escreve apenas a parte da string capturada no grupo 2.
> >
> >
> > Em geral, fica a dica: se seu script começar a ter muito CAT, LS,
> > FIND, FOR, READ, GREP, TR, CUT, SED, HEAD e TAIL misturados, verifique
> > se não é possível trocar tudo por um ou vários SEDs e FINDs.
> > Normalmente é possível e recomendável.
> >
> > Fábio David Batista
> > fabio.david.batista@g...
>
> > http://nerd-o-matic.blogspot.com
> >
> > On Wed, 19 Jan 2005 16:00:13 -0000, oteb_04 <hpfn@i...> wrote:
> > >
> > > --- Em address@hidden, Fábio Batista
> > > <fabio.david.batista@g...> escreveu
> > > > [fabio@elefante arquivos]$ ls -l
> > > > total 0
> > > > -rw-r--r-- 1 fabio suprifattus 0 Jan 19 13:17 112_12345.BMP
> > > > -rw-r--r-- 1 fabio suprifattus 0 Jan 19 13:17 115_12345.BMP
> > > > -rw-r--r-- 1 fabio suprifattus 0 Jan 19 13:17 122_12345.BMP
> > > > -rw-r--r-- 1 fabio suprifattus 0 Jan 19 13:17 123_12345.BMP
> > > >
> > > > [fabio@elefante arquivos]$ ls | sed -r 's/([0-9]{3}_)(.*)/mv \0
> \L\2/'
> > > > mv 112_12345.BMP 12345.bmp
> > > > mv 115_12345.BMP 12345.bmp
> > > > mv 122_12345.BMP 12345.bmp
> > > > mv 123_12345.BMP 12345.bmp
> > > >
> > > > Depois disso, basta fazer o pipe com o sh, para executar os
> comandos:
> > > > ls | sed -r 's/([0-9]{3}_)(.*)/mv \0 \L\2/' | sh
> > > >
> > > Ia enviar um terceiro email com o script completo, já que mesmo
> > > o segundo, assim com o primeiro, estava na verdade sem dar uma
> > > solução.
> > > Mas achei essa linha deixando o loop for que fiz um tanto arcaico.
> > >
> > > #!/bin/bash
> > > ls|grep .BMP > teste.sh
> > > ls|grep .BMP|tr -s 'BMP' 'bmp'|sed 's/.*_//g' > teste1.sh
> > >
> > > x=1
> > > for i in `cat teste.sh`
> > > do
> > > X=$(sed -n /$x/p teste1.sh)
> > > mv $i $X
> > > ((x++))
> > > done
> > >
> > > Fábio, dá para explicar a linha de comando com mai detalhes?
> > >
> > > abraço
> > > Beto
> > >
> > >
> > >
> > >
> > >
> > > ---------------------------------------------------------------------
> > > Esta lista não admite a abordagem de outras liguagens de
> programação, como
> > > perl, C etc. Quem insistir em não seguir esta regra será moderado
> sem prévio
> > > aviso.
> > > ---------------------------------------------------------------------
> > > Sair da lista: address@hidden
> > > ---------------------------------------------------------------------
> > > Esta lista é moderada de acordo com o previsto em
> > > http://www.listas-discussao.cjb.net
> > > ---------------------------------------------------------------------
> > >
> > >
> > >
> > >
> > >
> > > Yahoo! Grupos, um serviço oferecido por:
> > >
> > >
> > >
> > >
> > >
> > >
> > > ________________________________
> > > Links do Yahoo! Grupos
> > >
> > > Para visitar o site do seu grupo na web, acesse:
> > > http://br.groups.yahoo.com/group/shell-script/
> > >
> > > Para sair deste grupo, envie um e-mail para:
> > > address@hidden
> > >
> > > O uso que você faz do Yahoo! Grupos está sujeito aos Termos do
> Serviço do
> > > Yahoo!.
>
>
>
>
>
> ---------------------------------------------------------------------
> Esta lista não admite a abordagem de outras liguagens de programação, como
> perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio
> aviso.
> ---------------------------------------------------------------------
> Sair da lista: address@hidden
> ---------------------------------------------------------------------
> Esta lista é moderada de acordo com o previsto em
> http://www.listas-discussao.cjb.net
> ---------------------------------------------------------------------
>
>
>
>
>
> Yahoo! Grupos, um serviço oferecido por:
>
>
>
>
>
>
> ________________________________
> Links do Yahoo! Grupos
>
> Para visitar o site do seu grupo na web, acesse:
> http://br.groups.yahoo.com/group/shell-script/
>
> Para sair deste grupo, envie um e-mail para:
> address@hidden
>
> O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço do
> Yahoo!.