查找文件夹/子文件夹中丢失的文件

查找文件夹/子文件夹中丢失的文件

我有一个基于rsync --link-dest.我正在尝试进一步优化磁盘使用。

有时,我会删除源文件夹中的大文件。自动搜索这些文件以便我可以在备份中删除它们(如果我认为合适)的简单方法是什么?

类似于“查找/media/backup大于 100MB 并且没有硬链接到任何内容的文件/media/backup/latest”?

笔记:

  • 中可以有10-20个备份文件夹/media/backup,按日期命名。latest是一个符号链接...你猜对了。
  • 文件有时会被移动和/或重命名,并且在这些情况下通过偶尔检查hardlink.所以我假设搜索必须通过 inode 完成,而不是通过文件名完成。
  • 我知道有些工具可以识别硬链接,例如du-du /media/backup/*只会报告额外的每个备份文件夹使用的备用文件 - 但我不知道如何利用它find

答案1

好吧...那么就该编程了。

这是适合我的用例的东西。我完全意识到这是蹩脚的代码......但发布以防万一它可以帮助其他人。表现比我预期的要好。

#!/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)),))

相关内容