Script retorna resultado inesperado [RESOLVIDO]

1. Script retorna resultado inesperado [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
DrNetwork

(usa CentOS)

Enviado em 26/09/2012 - 10:08h

Olá, eu estou tentando fazer o seguinte:

Selecionar todos os arquivos maiores de 1MB em um determinado diretório e excluí-los regularmente através do crontab.

Segue o script que fiz até agora:

*************************************************************
#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."
SIZE=1000


#Argumentos de diretorio e tamanho
if test -n "$1"; then DIR=$1; fi;
if test -n "$2"; then SIZE=$2; fi;

echo Finding Backup Files in $DIR bigger than $SIZE KB

FILES='find ${DIR} -size +${SIZE} KB |sed -e "s/ /?/g"'


if test -n '$FILES'; then ls -l $FILES;
else echo "No files found"; fi;
**************************************************************

O resultado disso é:

[root@localhost var]# ./ifthen.test
Finding Backup Files in . bigger than 1000 KB
ls: invalid option -- 'z'
Try `ls --help' for more information.


Agora, de onde ele tirou essa opção inválida do ls? Tentei trocar as aspas simples e duplas em vários lugares, mas não consegui nada.
Consertado isso, como apago só o que ele selecionou?

Agraddeço de antemão.


  


2. Re: Script retorna resultado inesperado [RESOLVIDO]

Leandro Nkz
leandro

(usa Arch Linux)

Enviado em 27/09/2012 - 12:19h

DrNetwork escreveu:

Olá, eu estou tentando fazer o seguinte:

Selecionar todos os arquivos maiores de 1MB em um determinado diretório e excluí-los regularmente através do crontab.

Segue o script que fiz até agora:

*************************************************************
#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."
SIZE=1000


#Argumentos de diretorio e tamanho
if test -n "$1"; then DIR=$1; fi;
if test -n "$2"; then SIZE=$2; fi;

echo Finding Backup Files in $DIR bigger than $SIZE KB

FILES='find ${DIR} -size +${SIZE} KB |sed -e "s/ /?/g"'


if test -n '$FILES'; then ls -l $FILES;
else echo "No files found"; fi;
**************************************************************

O resultado disso é:

[root@localhost var]# ./ifthen.test
Finding Backup Files in . bigger than 1000 KB
ls: invalid option -- 'z'
Try `ls --help' for more information.


Agora, de onde ele tirou essa opção inválida do ls? Tentei trocar as aspas simples e duplas em vários lugares, mas não consegui nada.
Consertado isso, como apago só o que ele selecionou?

Agraddeço de antemão.



Para adicionar a saída de um comando à uma variável, você coloca o comando entre crases `` ou um $():

Assim:

#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."
SIZE=1000


#Argumentos de diretorio e tamanho
if test -n "$1"; then DIR=$1; fi;
if test -n "$2"; then SIZE=$2; fi;

echo Finding Backup Files in $DIR bigger than $SIZE KB

FILES=`find ${DIR} -size +${SIZE} |sed -e "s/ /?/g"`


if test -n '$FILES'; then ls -l $FILES;
else echo "No files found"; fi;


Ou:

#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."
SIZE=1000


#Argumentos de diretorio e tamanho
if test -n "$1"; then DIR=$1; fi;
if test -n "$2"; then SIZE=$2; fi;

echo Finding Backup Files in $DIR bigger than $SIZE KB

FILES=$(find ${DIR} -size +${SIZE} |sed -e "s/ /?/g")


if test -n '$FILES'; then ls -l $FILES;
else echo "No files found"; fi;


Eu acrescentei o "find" entre crases (ou $() ) e removi o "KB" do ${SIZE} para não dar erro no find.

Testa aí.
Abraço.



3. Re: Script retorna resultado inesperado [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
drnetwork

(usa CentOS)

Enviado em 27/09/2012 - 16:55h

Tu é pika, neguinho, mas se liga:

1- o primeiro script que tu botou ali tava igualzinho sem o KB e não funcionou retornando o mesmo erro.

2- O segundo com parenteses, funcionou bem "até demais". Ele procurou recursivamente. Eu não quero que ele busque nos subdiretórios. Somente no diretório especificado (ou no "." quando não especificado). Isso é possível?

3- Como vc fez para botar seu script separado do resto do texto e todo coloridinho?

Abcs


4. Re: Script retorna resultado inesperado [RESOLVIDO]

Leandro Nkz
leandro

(usa Arch Linux)

Enviado em 27/09/2012 - 17:35h

drnetwork escreveu:

Tu é pika, neguinho, mas se liga:

1- o primeiro script que tu botou ali tava igualzinho sem o KB e não funcionou retornando o mesmo erro.

2- O segundo com parenteses, funcionou bem "até demais". Ele procurou recursivamente. Eu não quero que ele busque nos subdiretórios. Somente no diretório especificado (ou no "." quando não especificado). Isso é possível?

3- Como vc fez para botar seu script separado do resto do texto e todo coloridinho?

Abcs


Vejamos....

1- Estranho, aqui funcionou.
2- Pelo menos um deles funcionou! rs
Se você especificar o diretório, deste jeito:

./ifthen.test diretório

Ele só vai procurar recursivamente dentro dele. Mas, se você não especificar nada, ele vai procurar dentro de todos os arquivos que começam com ".", ou seja, em todos as pastas ocultas.

Se você quer que ele procure apenas dentro da pasta especificada, sem adentrar em subdiretórios, basta acrescentar a opção "-maxdepth" + o número de 'camadas' de diretórios no find. Ficaria assim:

#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."
SIZE=1000


#Argumentos de diretorio e tamanho
if test -n "$1"; then DIR=$1; fi;
if test -n "$2"; then SIZE=$2; fi;

echo Finding Backup Files in $DIR bigger than $SIZE KB

FILES=$(find ${DIR} -maxdepth 1 -size +${SIZE} |sed -e "s/ /?/g")


if test -n '$FILES'; then ls -l $FILES;
else echo "No files found"; fi;


3- Para deixar o código do jeito que está acima, basta usar as tags "code":

[ code ]Seu script[ /code ]

Obs.: sem os espaços.


5. Re: Script retorna resultado inesperado [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
drnetwork

(usa CentOS)

Enviado em 27/09/2012 - 17:52h

boa, cara! O maxdepth resolveu a questão do recursivo.

No entanto... (sempre tem um porém!)

o else não está funcionando. Se procuro normal, legal, ele acha. Mas se procuro colocando um tamanho tipo 40M e não tem nada com 40M, ele me retorna o resultado de "ls -l" só que sem o colorido, ao invés do "no files found".

Alguma ideia do por quê?

P.S.: Valeu pela dica do code. já testei e funciona.


6. Re: Script retorna resultado inesperado [RESOLVIDO]

Leandro Nkz
leandro

(usa Arch Linux)

Enviado em 27/09/2012 - 18:15h

drnetwork escreveu:

boa, cara! O maxdepth resolveu a questão do recursivo.

No entanto... (sempre tem um porém!)

o else não está funcionando. Se procuro normal, legal, ele acha. Mas se procuro colocando um tamanho tipo 40M e não tem nada com 40M, ele me retorna o resultado de "ls -l" só que sem o colorido, ao invés do "no files found".

Alguma ideia do por quê?

P.S.: Valeu pela dica do code. já testei e funciona.


Era só uma aspa que estava no test -n '$FILES'. As aspas simples "desativa" a variável, a dupla apenas a "embala".

Teste novamente:

#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."
SIZE=1000


#Argumentos de diretorio e tamanho
if test -n "$1"; then DIR=$1; fi;
if test -n "$2"; then SIZE=$2; fi;

echo Finding Backup Files in $DIR bigger than $SIZE KB

FILES=$(find ${DIR} -maxdepth 1 -size +${SIZE}k |sed -e "s/ /?/g")


if test -n "$FILES"; then ls -l $FILES; else echo "No files found"; fi;


Lembrando que você deve especificar o tamanho em "bytes", sem o uso de medidas de tamanho.

Exemplo, para procurar arquivos maiores de 40MB na pasta Downloads, basta utilizar:

./ifthen.2.test Downloads/ 40000

Obs.: Este é um valor aproximado já que 40MB não equivale a exatos 40.000 KB
Abraço!


######################
Edit:

Acrescente também um "k" depois da variável ${SIZE}. Fiz alguns testes e ele não estava reconhecendo corretamente o tamanho dos arquivos.


7. Re: Script retorna resultado inesperado [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
drnetwork

(usa CentOS)

Enviado em 28/09/2012 - 11:16h

Cara, Leandro, tentei com k(b), K(B), colado na variável, com espaço... nada funcionou. Continua retornando o resultado de "ls -l".

Em algumas das tentativas, gerou erro:

find: invalid -size type `K'

find: paths must precede expression: k
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

find: paths must precede expression: KB
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

find: invalid -size type `B'

find: Invalid argument `+40000kb' to -size

find: paths must precede expression: kb
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

vale notar que quando coloquei só o k e colado na variável (como vc postou), ele não deu erro, mas ainda assim listou o diretório...


8. Re: Script retorna resultado inesperado [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
drnetwork

(usa CentOS)

Enviado em 28/09/2012 - 11:24h

Dei uma lida no manual do find e alterei a parte do size. O resultado é o mesmo, mas como quero esse script para ver arquivos realmente grandes, acho que assim fica mais visualmente limpo:

#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."

SIZE=40


#Argumentos de diretorio e tamanho

if test -n "$1"; then DIR=$1; fi;
if test -n "$2"; then SIZE=$2; fi;


echo Finding Backup Files in $DIR bigger than $SIZE MB

FILES=$(find ${DIR} -maxdepth 1 -size +${SIZE}M |sed -e "s/ /?/g")

if test -n '$FILES'; then ls -l $FILES;
else echo "No files found"; fi;


Só pra reiterar: Continua não retornando o resultado esperado.


9. Re: Script retorna resultado inesperado [RESOLVIDO]

Leandro Nkz
leandro

(usa Arch Linux)

Enviado em 28/09/2012 - 16:49h

Eu dei uma ligeira modificada no script. Teste este:

#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."

SIZE="40"

#Argumentos de diretorio e tamanho

if test -n "$1"; then
DIR=$1
fi

if test -n "$2"; then
SIZE=$2
fi

echo "Finding Backup Files in $DIR bigger than $SIZE MB"

FILES=$(find "$DIR" -maxdepth 1 -size +"$SIZE"M | sed -e "s/ /?/g")

if test -n "$FILES" ; then
ls -l $FILES
else
echo "No files found"
fi

exit 0


Eu testei e funcionou, veja:

./ifthen.test
Finding Backup Files in . bigger than 40 MB
No files found


./ifthen.test Downloads/
Finding Backup Files in Downloads/ bigger than 40 MB
No files found


./ifthen.test Downloads/ 20
Finding Backup Files in Downloads/ bigger than 20 MB
-rw-r--r-- 1 leandro leandro 21021190 Set 5 21:04 Downloads/firefox-15.0.1.tar.bz2



10. Re: Script retorna resultado inesperado [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
drnetwork

(usa CentOS)

Enviado em 28/09/2012 - 17:36h

Parabéns Mlk! Acertou na mosca! Obrigado pela ajuda. Abcs.


leandro escreveu:

Eu dei uma ligeira modificada no script. Teste este:

#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."
SIZE="40"

#Argumentos de diretorio e tamanho

if test -n "$1"; then
DIR=$1
fi

if test -n "$2"; then
SIZE=$2
fi

echo "Finding Backup Files in $DIR bigger than $SIZE MB"

FILES=$(find "$DIR" -maxdepth 1 -size +"$SIZE"M | sed -e "s/ /?/g")

if test -n "$FILES" ; then
ls -l $FILES
else
echo "No files found"
fi

exit 0


Só para completarmos, como o objetivo inicial no enunciado era apagar tais arquivos, adicionei mais um pedaço de código e agora funciona 100% ao objetivo apresentado.

#!/bin/sh

#Valores padrões para comando sem argumento

DIR="."
SIZE="1"

#Argumentos de diretorio e tamanho

if test -n "$1"; then
DIR=$1
fi

if test -n "$2"; then
SIZE=$2
fi

echo "Finding Backup Files in $DIR bigger than $SIZE MB"

FILES=$(find "$DIR" -maxdepth 1 -size +"$SIZE"M | sed -e "s/ /?/g")

if test -n "$FILES" ; then
echo "there are files to remove"
rm -rv $FILES
else
echo "No files found"
fi

echo "Nothing else to do. Thanks for using me"
exit 0




11. Re: Script retorna resultado inesperado [RESOLVIDO]

Leandro Nkz
leandro

(usa Arch Linux)

Enviado em 28/09/2012 - 17:54h

drnetwork escreveu:

Parabéns Mlk! Acertou na mosca! Obrigado pela ajuda. Abcs.



Viva!! \o/


drnetwork escreveu:

página dá erro ao tentar marcar como "RESOLVIDO"


Tomei a liberdade de marcá-lo pra você.
Abraço.


12. Re: Script retorna resultado inesperado [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
drnetwork

(usa CentOS)

Enviado em 28/09/2012 - 17:58h

como conseguiu?

agora tb ta dando erro quando tento marcar tua resposta como a melhor... afff



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts