Discussion:
[shell-script] Script para remover arquivos antigos
Tiago Schievenin tskiva84@gmail.com [shell-script]
2018-10-03 19:52:01 UTC
Permalink
Boa tarde Pessoal,

Desenvolvi um script para remover arquivos antigos, que não são acesseados
ou modificados há mais de 180 dias, neste script é necessário me basear no
nome do diretório que possui a data em que o mesmo foi criado e não a data
de criação do arquivo.

O script esta funcionando, porém a execução dele é um pouco lenta, existe
alguma maneira de tunar este script:

for i in `seq 180 365`
do
DATE=`date +%Y"."%m"."%d --d ''$i' days ago'`
find $DIR -name *$DATE* -type d | tee -a $LOG | xargs rm -rf
done

Desde já muito obrigado.

Atenciosamente,
Tiago S Gonçalves
Cristiano Amaral cristianoeinar@gmail.com [shell-script]
2018-10-03 20:08:14 UTC
Permalink
find,ctime e delete
Post by Tiago Schievenin ***@gmail.com [shell-script]
Boa tarde Pessoal,
Desenvolvi um script para remover arquivos antigos, que não são acesseados
ou modificados há mais de 180 dias, neste script é necessário me basear no
nome do diretório que possui a data em que o mesmo foi criado e não a data
de criação do arquivo.
O script esta funcionando, porém a execução dele é um pouco lenta, existe
for i in `seq 180 365`
do
DATE=`date +%Y".."%m"."%d --d ''$i' days ago'`
find $DIR -name *$DATE* -type d | tee -a $LOG | xargs rm -rf
done
Desde já muito obrigado.
Atenciosamente,
Tiago S Gonçalves
itamarnet@yahoo.com.br [shell-script]
2018-10-04 01:10:45 UTC
Permalink
Caro Tiago


Não sei se a estratégia de um loop usado for, como foi usado ou mesmo usando while, seja a mais adequada.
Ainda mais que vc faz um find 185 vezes na forma como concebeu seu script.


Os diretórios tem a nomenclatura ANO..MÊS.DIA ou essa é apenas parte do nome de diretório?


Se for o nome completo faça um find listando os diretórios, coloque a listagem em ordem decrescente usando o sort, e apague a parte da listagem do limite de 180 dias até o final, essa listagem filtrada vc joga para o rm com xargs como é feito no seu script original.


Algo como:


DATE=`date +%Y"."%m"."%d --d ''$i' days ago'`
find $DIR -type d | sort -nr | sed "/$DATE/,$d" | tee -a $LOG | xargs rm -rf


É um código simples sem testar pois estou longe do meu computador, mas creio que possa ser mais rápido


[]'s
Itamar
itamarnet@yahoo.com.br [shell-script]
2018-10-04 11:46:36 UTC
Permalink
Desculpe-me Tiago

O sort não é decrescente, a lógica que disse no e-mail está invertida.


O sort é normal então no lugar de sort -nr use apenas sort -n.


Foi um lapso.


[]'s
Itamar
itamarnet@yahoo.com.br [shell-script]
2018-10-04 12:02:24 UTC
Permalink
Completando a lógica Tiago

Se acaso não existir o diretório e considerando que esse padrão de data é parte do nome talvez fosse melhor usar outra tática:


DATE=`date +%Y"."%m"."%d --d ''$i' days ago'`

find $DIR -type d |
sed -r 's/.*([0-9]{4}\.\.[01][0-9]\.[0-3][0-9]).*/\1 &/' |

awk -v awk_data="$DATA" '$1<awk_data{print $2}' |

tee -a $LOG |
xargs rm -rf



[]'s
Itamar
Tiago Schievenin tskiva84@gmail.com [shell-script]
2018-10-09 12:43:27 UTC
Permalink
Obrigado pessoal!!!!
Consegui melhorar o script com a dica do Itamar.

Muito obrigado a todos!!!!!
Post by ***@yahoo.com.br [shell-script]
Completando a lógica Tiago
Se acaso não existir o diretório e considerando que esse padrão de data é
DATE=`date +%Y"."%m"."%d --d ''$i' days ago'`
find $DIR -type d |
sed -r 's/.*([0-9]{4}\.\.[01][0-9]\.[0-3][0-9]).*/\1 &/' |
awk -v awk_data="$DATA" '$1<awk_data{print $2}' |
tee -a $LOG |
xargs rm -rf
[]'s
Itamar
itamarnet@yahoo.com.br [shell-script]
2018-10-03 22:37:56 UTC
Permalink
Caro Tiago


Não sei se a estratégia de um loop usado for, como foi usado ou mesmo usando while, seja a mais adequada.
Ainda mais que vc faz um find 185 vezes na forma como concebeu seu script.


Os diretórios tem a nomenclatura ANO..MÊS.DIA ou essa é apenas parte do nome de diretório?


Se for o nome completo faça um find listando os diretórios, ordene a listagem usando o sort, e apague a parte da listagem do limite de 180 dias até o final, essa listagem filtrada vc joga para o rm com xargs como é feito no seu script original.


Algo como:


DATE=`date +%Y"."%m"."%d --d ''$i' days ago'`
find $DIR -type d | sort | sed "/$DATE/,$d" | tee -a $LOG | xargs rm -rf


É um código simples sem testar pois estou longe do meu computador, mas creio que possa ser mais rápido


[]'s
Itamar
Loading...