Limpando o .recycle do Samba

Publicado por saulo fabrin em 12/10/2005

[ Hits: 14.084 ]

 


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

Convert[endo] fotos

Lançamento do Vulture AntiSpam 1.0

Bloqueando anexos no QmailToaster com MIME

Leitura recomendada

Criando um script para acessar sua unidade Zip

Curso de Shell Script Avançado

Fazendo backup ou cópia somente dos arquivos alterados no último dia

CGI + Shell Script: gerando listagem de IPs disponíveis em sua rede

Monitoramento de link de internet de servidores

  

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