Localizar arquivos ausentes de uma pasta / subpasta

0

Eu tenho um sistema de backup baseado em rsync --link-dest . Estou tentando otimizar o uso do disco um pouco mais.

De vez em quando, apago arquivos grandes na pasta de origem. O que seria uma maneira fácil de procurar automaticamente esses arquivos para que eu possa excluí-los no backup (se eu achar apropriado)?

Algo como "localizar arquivos em /media/backup maiores que 100 MB e que não são vinculados a nada em /media/backup/latest "?

Notas:

  • Pode haver de 10 a 20 pastas de backup em /media/backup , nomeadas por data. latest é um link simbólico para ... você adivinhou.
  • Os arquivos às vezes são movidos e / ou renomeados, e os links físicos são recriados nesses casos por verificações ocasionais com hardlink . Então, estou assumindo que a pesquisa deve ser feita por inode, não por nome de arquivo.
  • Sei que algumas ferramentas estão cientes dos links de hardware, como du - du /media/backup/* relatará apenas a sobressalente extra usada por cada pasta de backup - mas não sei como aproveitar isso com find .
por jmr 06.10.2018 / 16:57

1 resposta

0

Tudo bem ... hora de programá-lo então.

Aqui está algo que funciona para o meu caso de uso. Estou plenamente ciente de que este é um código de baixa qualidade ... mas postando no caso de poder ajudar alguém. O desempenho é melhor do que eu esperava.

#!/usr/bin/python3

import sys
import os

if len(sys.argv) < 3:
    print("Usage: %s <basepath> <minsize>" % (sys.argv[0],))
size = int(sys.argv[2])

# step 1: find inodes of all large files in most recent backup
inodes = []
for root, dirs, files in os.walk(sys.argv[1]+"latest"):
    for name in files:
        file = os.path.join(root, name)
        statinfo = os.stat(file)
        if(statinfo.st_size >= size):
            inodes.append(statinfo.st_ino)

# step 2: find inodes of all large files in all backups, and display if only not in list built in step 1
for root, dirs, files in os.walk(sys.argv[1]):
    for name in files:
        file = os.path.join(root, name)
        statinfo = os.stat(file)
        if(statinfo.st_size >= size):
            try:
                position=inodes.index(statinfo.st_ino)
            except ValueError:
                print("Match: %s (%dMB)" % (file,(statinfo.st_size/(1024*1024)),))
    
por 07.10.2018 / 05:03

Tags