Menu Principal

quinta-feira, 8 de setembro de 2011

Limpando a lixeira 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

by Saulo Fabrin

Fonte: Viva o Linux



Apenas para listar
Quando o arquivo é deletado do servidor, a data de criação e da última alteração não são modificados, contudo o campo inode é alterado. O parâmtero -mtime não verifica a alteração no inode, já o ctime verifica. Por esse motivo foi usado o ctime. O comando ls -l não exibe a data de deleção do arquivo, por isso foi utilizado o comando "stat -c".
Exemplo:
#find path-da-lixeira -type f -ctime -1 -exec stat -c "%n %z" {} \;
O comando acima lista todos os arquivos deletados nas últimas 24 horas e exibe nesta lista a data da deleção e o nome do arquivo.
O comando "stat -c" permite visualizar a data em que o arquivo foi deletado e o parâmetro -ctime verifica a alteração no inode do arquivo.
Outra alternativa é alterar o /etc/samba/smb.conf
O parâmetro recycle:touch = True da configuração da lixeira permite que quando o arquivo for deletado o samba altera a data de criação do arquivo para a data da respectiva deleção.

Ex.
path = /teste/lixeira
public = yes
writeable = yes
read only = no
create mask = 0777
guest ok = yes
recycle:exclude = *.tmp *.temp *.o *.obj ~$*
recycle:keeptree = True
recycle:touch = True
recycle:versions = True
recycle:noversions = .doc|.xls|.ppt
recycle:repository = .recycle
recycle:maxsize = 0
vfs objects = recycle


Nenhum comentário:

Postar um comentário