Erro no script. [RESOLVIDO]

1. Erro no script. [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 19/06/2012 - 14:04h

Olá pessoal, estou tentando fazer aqui um pequeno script para procurar strings dentro de arquivos,
se encontrado, mover para outra pasta. segue:


#!/bin/bash
for i in $(grep $1 * | cut -d : -f 1)
do
mv "$i" ./$2/
done


sendo assim, em uma pasta com dezenas de arquivos, chamo o script da seguinte forma:
sh mover.sh cliente backup

o primeiro parametro "cliente" é a string que procuro nos arquivos.
o segundo parametro "backup" é a pasta para onde eu quero mover.

o problema está em arquivos que tem espaço no nome. por exemplo criei um arquivo de teste assim:
echo cliente >> "testando arquivo agora.txt"

depois chamei o comando
sh mover.sh cliente backup

ai retornou os erros:

mv: impossível obter estado de "testando": Arquivo ou diretório não encontrado
mv: impossível obter estado de "arquivo": Arquivo ou diretório não encontrado
mv: impossível obter estado de "agora.txt": Arquivo ou diretório não encontrado


ou seja, ao inves do resultado do comando "grep $1 * | cut -d : -f 1" colocar na variável i o valor "testando arquivo agora.txt" ele está fragmentando o retorno separando por espaços....

alguém pode me dizer o q to fazendo errado?


  


2. MELHOR RESPOSTA

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 19/06/2012 - 16:38h

Consegui! Eu havia lido um artigo do Júlio (Papo de Botequim) q referia exatamente a modificação do padrão d referência dos arquivos do bash:

http://jneves.wordpress.com/2008/03/05/papo-de-botequim-parte-7/

E resolvi seu problema dessa forma:


#!/bin/bash
oIFS="$IFS"
IFS=
for i in $(grep $1 * | cut -d: -f1)
do
echo "$i"
sleep 5
mv "$i" $2
done
IFS="$oIFS"


Agora vai!

3. Re: Erro no script. [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 19/06/2012 - 14:19h

Bom, para automatizar isso eu não sei t informar como faz, mas eu posso t dizer q o Linux trata arquivos com espaços da seguinte forma:


ls testando\ arquivo\ agora.txt


Assim ele identifica q vc quer realmente indicar q o espaço pertence ao msm nome do arquivo. Ae o seu script teria q acrescentar a barra invertida quando achar o arquivo com espaços. A minha sugestão é fazer uma condição para encontrar isso e acrescentar a barra a cada arquivo com espaço com o sed...


4. Re: Erro no script. [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 19/06/2012 - 14:42h

Fala Renato,
foi uma boa observação a sua, mas ai eu substitui o espaço por \(espaço) e não resolveu.
ele continua quebrando o retorno quando tem espaço.




5. Re: Erro no script. [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 19/06/2012 - 14:47h

Como vc fez essa substituição? Acho q vc fez algo errado...


6. Re: Erro no script. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/06/2012 - 14:48h

já tentou assim:


#!/bin/bash
for i in $(grep $1 | cut -d: -f1)
do
mv "$i" ./$2/
done



7. Re: Erro no script. [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 19/06/2012 - 15:08h

renato,
substitui assim:

#!/bin/bash
for i in $(grep $1 | cut -d : -f 1 | sed 's/ /\\ /g') #substitua (espaço) por \(espaço)
do
echo "$i"
sleep 5
mv "$i" ./$2/
done


eabreu,
do jeito que vc fez não funciona, pois vc não indicou os arquivos para aplicar o grep.


8. Re: Erro no script. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/06/2012 - 15:15h

então a parâmetro $1 representa o diretório aonde estão os arquivos é isso ?


9. Re: Erro no script. [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 19/06/2012 - 15:24h

Vc testou o comando sem o script pra saber se dá certo?


grep teste *| cut -d : -f 1 | sed 's/ /\\ /g'


Eu acho q não vai dar certo...


10. Re: Erro no script. [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 19/06/2012 - 15:33h

eabreu,
o $1 é a string a ser procurada dentro dos arquivos, e o script está dentro da mesma pasta que os arquivos.

renato,
sem o script o retorno é limpo:
grep cliente * | cut -d : -f 1
testando arquivo agora.txt


só quando faz no script que dá problema....
nossa que canseira...


11. Re: Erro no script. [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 19/06/2012 - 15:46h

O problema é no mv! Tente assim:


#!/bin/bash
for i in $(grep $1 | cut -d : -f 1)
do
u=$(echo $i | sed 's/ /\\ /g')
echo "$u"
sleep 5
mv "$u" ./$2/
done



12. Re: Erro no script. [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 19/06/2012 - 16:01h

renato,
ainda não deu.
continua com o mesmo problema..
roda ai na sua máquina pra vc ver.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts