Em Tue, 11 Mar 2003 13:00:33 -0300
"Wilson Dias Goi" <[EMAIL PROTECTED]> escreveu:

> Tentei fazer uma script que alterasse um caracter para outro nos
> arquivos, atraves da renomeacao de arquivos.
> A maioria dos arquivos tem espacos em branco.
> Tentei de varias formas mas o mv sempre da a mensagem : "mv: ao mover
> multiplos arquivos o último argumento deve ser um diretorio"
> Por exemplo, aqui tentei converter caracteres maiusculos em
> minusculos:
> 
> for x in /bin/ls $dir; do
>          y=_cho $x | tr '[:upper:]' '[:lower:]'
>           if [ $x != $y]; then
>             mv $x $y
>           fi
>       done
> 
> Ja consultei varias documentacoes e nada encontrei sobre este
> problema. Alguem tem uma dica ?

  Alem do já indicado pelo Rodrigo, acho que na expansão de `/bin/ls
$dir` o for interpreta os espaços como um separador dos itens da lista.
Então um arquivo com o nome "isso eh um arquivo" é interpretado como
arquivos "isso", "eh", "um", "arquivo".

  Uma sugestão é modificar a expressão que dá a lista para o for
substituindo espaços por um outro caracter que nunca apareça nos nomes
dos arquivos, e depois na hora de renomear o arquivo, substituir de
volta o caracter no nome como espaço (no exemplo abaixo, usei o caracter
"+", que julgo difícil aparecer em nome de arquivo, mas poderia ser
outro caracter).

  Não sei quase nada de script shell, por isso provavelmente essa é uma
solução deselegante, mas seria algo assim:

 for x in `/bin/ls|sed -e "s/\ /+/g"`; do 
           y=`echo $x | tr [:upper:] [:lower:]`;
           if [ $x != $y ]; then 
                   x=`echo $x |sed -e "s/+/\ /g"`; 
                   y=`echo $y|sed -e "s/+/\ /g"`; 
                   mv "$x" "$y"; 
           fi; 
 done

> Wilson
> 

Até mais.

-- 
Paulo R. Ormenese
GNU/Linux User #200782
Jundiaí-SP

Responder a