Limpando o .recycle do Samba

Publicado por saulo fabrin em 12/10/2005

[ Hits: 14.477 ]

 


Limpando o .recycle do Samba



Quando utilizamos o Samba como PDC, temos a opção de utilizar uma lib chamada ".recycle", que realiza a tarefa de manter em um diretório (.recycle) todos os arquivos apagados pelos usuários, o que muitas vezes é bem mais rápido do que voltar backup e bibibi bóbóbó.

Um detalhe importante desta lib .recycle do Samba é que quando um determinado arquivo é excluído de sua pasta original e enviado para a lixeira, é mantida a data original do arquivo e não a data de exclusão do mesmo, o que trás dificuldades se queremos limpar a nossa lixeira deixando apenas os arquivos excluídos nos últimos 30 dias.

Para saber o dia em que o arquivo foi enviado para a lixeira, vamos utilizar o seguinte comando:

$ stat /fileserver/.recycle/teste.txt
 
File: "/fileserver/.recycle/teste.txt"
Size: 32256            Blocks: 64         IO Block: 4096   Regular File
Device: 806h/2054d     Inode: 6373477     Links: 1
Access: (0766/-rwxrw-rw-)  Uid: (  850/linux)   Gid: (  850/linux)
Access: Tue May 31 19:34:00 2005
Modify: Tue May 31 19:33:46 2005
Change: Tue May 31 19:44:06 2005

O que nos interessa aqui é a linha do "Change", que contém a data, hora e ano em que o arquivo foi enviado para a lixeira. Para isto utilizamos:

$ stat -c "%n %z" /fileserver/.recycle/teste.txt
teste.txt Tue May 31 19:44:06 2005

Onde:
  • -c - para definir formato
  • %n - exibe nome do arquivo
  • %z - exibe data da última modificação

Para facilitar fiz o seguinte script:

#!/bin/sh
#
# recycle.sh - Utilizado para remover arquivos da lixeira do samba
#
# Autor: Saulo Fabrin <caroco@gmail.com>
#
# Este programa deve ser colocado no cron e executado todos os dias
# para remover arquivo antigos da lixeira do samba com base nos
# parâmetros "DIR" e "DAT"
#
# Onde:
#
# DIR - diretório principal onde esta localizado o .recycle
# DAT - remove os arquivos há 30 dias, a partir da data atual
#


DIR="/fileserver/"
DAT="30"

#utilizado para gerar as datas
DAT1=`date --date "$DAT day ago" | awk '{print $1" "$2" "$3}'`
DAT2=`echo $DAT1 | awk '{print $1}'`


#localiza e exclui os arquivos de acordo com os parâmetros passados
find "$DIR" -type f -exec stat -c "%n %z" {} \; | grep ".recycle" | egrep -w "$DAT1" | awk -F "$DAT2" '{print $1}'| sed 's/^/"/g ; s/ $/"/g' | xargs -replace rm

Lembrando que se o formato da data for diferente do apresentado nos exemplos acima, o script deve ser alterado conforme as suas necessidades. :)

by Saulo Fabrin

Outras dicas deste autor

Bloqueando anexos no QmailToaster com MIME

Lançamento do Vulture AntiSpam 1.0

Convert[endo] fotos

Leitura recomendada

GNU parallel - Um ferramenta para execução de processos em paralelo

Shell Script nosso de cada dia - Episódio 4

Como contornar o erro -bash: 08: value too great for base (error token is "08")

Processos rivais

Exibir arquivo de grupos /etc/group de forma personalizada conforme o usuário

  

Comentários
[1] Comentário enviado por bisonho em 13/04/2006 - 23:53h

Ha um problema em utilizar a data de modificacao,
se um arquivo for antigo e for deletado, a data de modificacao se mantem
ou seja:
nao vai respeitar o prazo de 30 dias

utilizando a data de Change é respeitado o prazo

#+30 eh a quantidade de dias

find /share/.recycle -type f -ctime +30 -delete



[2] Comentário enviado por saulofabrin em 15/04/2006 - 09:13h

Caro Bisonho
Tenha mais "CUIDADO" com os comentários, se você ler a dica corretamente vai constatar que foi utilizado o Change.

[3] Comentário enviado por tomassoni em 12/08/2009 - 17:51h

Saulo, quando uso o comando stat da maneira que mencionou ele me retorna neste formato 2009-08-12 17:45:00.000000000 -0300 saberia me dizer se eu script funciona ou tenho que dar um jeito nessa precisão?

[4] Comentário enviado por tomassoni em 14/08/2009 - 09:13h

Bom seguindo a lógica resolvi o meu problema assim, como tenho a pasta .lixeira e dentro dela subdiretorios para cada usuário. ficando assim:

|.lixeira
|____User01
|Dir1
|DirN

E a minha data usando stat ficava como descrito assima, deixei meu script assim:

#! /bin/bash

# Limpa shell
clear

# Url para diretorio da lixeira
ur_dir_lixo="/hd500g/.lixeira"

# Url para arquivo de log
url_dir_log="/var/log/lixeira.log";

# remove os arquivos há 10 dias, a partir da data atual
dias="10";

# Utilizado para gerar as datas dos dias antigos
data_antigo="$(date --date "$dias day ago" +%Y-%m-%d)"


# Inicia calculo tempo gasto para limpeza
DATA_LOG=`date +%a-%d-%m-%Y-%H:%M:%S`
START=$(date +%s)


# Remove arquivo de log antigo
if [ -e $url_dir_log ] ; then
rm -rf $url_dir_log
fi

echo -ne "---Inicio: $DATA_LOG\n" >> $url_dir_log


# Remove o arquivo antigo baseado na variavel dias em relacao ao dia atual
find "$ur_dir_lixo" -type f -exec stat -c "%n %z" {} \; | grep ".lixeira" | egrep -w "$data_antigo" | awk -F "$data_antigo" '{print $1}' | xargs -replace rm 2>$url_dir_log


# Finaliza calculo tempo gasto para backup
DATA_LOG=`date +%a-%d-%m-%Y-%H:%M:%S`
echo -ne "------Fim: $DATA_LOG" >> $LOG
END=$(date +%s)
DIFF=$(( $END - $START ))

if [ $DIFF != 0 ]; then
TMP=`echo "scale=2; $DIFF / 60" | bc`
fi

echo -ne "\nTempo gasto em segundos: $DIFF" >> $url_dir_log
echo -ne "\nTempo gasto em minutos: $TMP" >> $url_dir_log



exit 0;

O unico probleminha que encontrei, foi que, quando so temos apenas um arquivo dentro do diretorio ele exclui o arquivo mas mantem o diretorio.

Saulo, muito obrigado pela dica, ficou bem funcional para mim. Espero que não se importe pelos ajustes e adição do tempo gasto.




[5] Comentário enviado por cherandinho em 03/09/2009 - 14:53h

Olá a todos, sou novo no mundo linux, e estou muito empolgado com tudo .
Estou usando o cenOS aqui , e estava com a mesma duvida em relação a precisão da data.
Vejo que a mesma não influenciou no script.
Só gostaria de parabeniza-los pela iniciativa , Saulo e tamassoni .



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts