我有一个基于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)),))