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

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

Re: [shell-script] script para leitura de arquivos


From: Rodrigo Monteiro
Subject: Re: [shell-script] script para leitura de arquivos
Date: Wed, 9 Mar 2005 08:17:33 -0800 (PST)

gustavo, muito obrigado pela sua ajuda. agora o meu
problema eh outro.
nessa linha abaixo acontece o seguinte erro:
if [ `ls -1
/usr/local/jabber-1.4.2/spool/im.ceara.gov.br/$2.*.xml
| wc -l` -gt 0 ]
quando para o parametro ($2) que passo existe o
arquivo (exemplo, $2=orgao01 e existe o arquivo
orgao01.usuario33.xml), ele funciona ok, como eu
quero, mas quando nao existe esse arquivo, ele da uma
mensagem de erro na tela dizendo que nao existe o
arquivo, quando ele executa esse 'ls' que esta dentro
no if. tentei colocar 2> /dev/null em alguns lugares
mas nao consegui. vc ou alguem tem uma ideia que possa
funcionar?


-----------
script.sh
-----------
if [ -e $1 ] ; then
        ls /usr/local/jabber-1.4.2/spool/im.ceara.gov.br/ |
cut -d. -f1 | uniq -c | awk '{print $2 ": " $1 "
usuarios"}'
else
        if [ $1 = "--help" ] ; then
                echo "Uso: "
                echo '     '"./script -o orgao: mostra a quantidade
de usuarios do orgao."
                echo '     '"./script: mostra todos os orgaos com a
quantidade dos seus respectivos usuarios"
                echo '     '"./script --help: mostra esta ajuda"
        elif [ $1 = "-o" ] ; then
                if [ `ls -1
/usr/local/jabber-1.4.2/spool/im.ceara.gov.br/$2.*.xml
| wc -l` -gt 0 ] ; then
                        echo "$2: `ls -1
/usr/local/jabber-1.4.2/spool/im.ceara.gov.br/$2.*.xml
| wc -l` usuarios"
                else
                        echo "$2: nao existe este orgao"
                fi
        else
                echo "$1: nao existe. digite script --help para
ajuda"
        fi
fi


--- Gustavo Chaves <address@hidden> wrote:
> >>>>> On Tue, 8 Mar 2005 08:48:57 -0800 (PST),
> Rodrigo Monteiro <address@hidden> said:
> 
>   > #cria o arquivo usuarios_total com todos os
> orgaos do diretorio onde ficam os arquivos dos
> usuarios (funciona OK)
>   > ls -1
> /usr/local/jabber-1.4.2/spool/im.ceara.gov.br/ | cut
> -f1 -d"."
>
>/usr/local/jabber-1.4.2/usr/rodrigo/usuarios_total.txt
>   > #tira os orgoas repetidos (funciona OK)
>   > sort -u
>
/usr/local/jabber-1.4.2/usr/rodrigo/usuarios_total.txt
> > /usr/local/jabber-1.4.2/usr/rodrigo/temp_usu.txt
>   > #daqui pra baixo eh que da erro
>   > #para ele ir da primeira ate a ultima linha do
> arquivo temp_usu.txt
>   > tot=`wc -l
> /usr/local/jabber-1.4.2/usr/rodrigo/temp_usu.txt`
>   > echo $tot >
> /usr/local/jabber-1.4.2/usr/rodrigo/total.txt
>   > cut -f1 -d" "
> </usr/local/jabber-1.4.2/usr/rodrigo/total.txt
> >/usr/local/jabber-1.4.2/usr/rodrigo/total02.txt
>   > total=`sed 1q
> /usr/local/jabber-1.4.2/usr/rodrigo/total02.txt`
>   > for ((cont=1;total;cont++))
>   > do
>   >     #colocar na variavel $pal o conteudo da
> linha numero $cont do arquivo temp_usu.txt
>   >     pal=`sed
>
-`$cont`q/usr/local/jabber-1.4.2/usr/rodrigo/temp_usu.txt`
>     
>   >     # mostrar "orgao01: 130 usuarios"
>   >     echo "$pal: `ls -1
>
/usr/local/jabber-1.4.2/spool/im.ceara.gov.br/$pal.*.xml
> | wc -l` usuarios"
>   > done
> 
> Se consegui entender direito o seu script, eu creio
> que o seguinte
> deveria funcionar:
> 
>       cd /usr/local/jabber-1.4.2
>       ls spool/im.ceara.gov.br | cut -f1 -d. | sort -u |
> while read pal; do
>           n=`find spool/im.ceara.gov.br -maxdepth 1 -name
> "$pal.*.xml" | wc -l`
>           echo "$pal: $n usuarios"
>       done
> 
> O primeiro 'cd' é só pra diminuir o tamanho das
> linhas seguintes.  Se
> você precisa voltar ao diretório original e estiver
> usando uma shell
> que suporte os comandos pushd e popd, troque o cd
> por um 'pushd
> /usr/local/jabber-1.4.2' e, no final, execute um
> 'popd' pra voltar.
> 
> O pipe que precede o while evita os vários arquivos
> temporários que
> você criou.
> 
> O while substitui o for, evitando a necessidade de
> contar as linhas,
> evitando as várias chamadas ao sed e simplificando a
> lógica.
> 
> Troquei o ls por um find porque se houverem muitos
> arquivos xml que
> casam com o glob "$pal.*.xml" a shell pode não
> conseguir expandi-los
> todos na linha de comando.  Dá pra fazer isso com um
> ls no diretório e
> filtrando com grep, mas fica difícil garantir que a
> expressão regular
> passada pro grep vai ser correta para todos os
> casos.
> 
> BTW, a opção -maxdepth é específica do find do GNU. 
> Se o seu find não
> a suportar dá pra simular isso com a opção -prune,
> mas fica mais
> complicado.
> 
> Por outro lado, eu não testei o script e pode não
> funcionar exatamente
> como você quer... caveat emptor.
> 
> Gustavo.
> 
> 

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 


reply via email to

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