我正在使用shell脚本每小时自动创建各种目录的压缩备份。如果我在相当长的一段时间内没有使用过它们,那么会产生很多重复的档案。文件的MD5哈希值不匹配,因为它们具有不同的文件名和文件名。创作日期等。
除了确保首先没有重复之外,另一个选择是检查文件大小是否匹配,但这并不意味着它们是重复的。
文件名是这样完成的;
Qt_2012-03-15_23_00.tgz
Qt_2012-03-16_00_00.tgz
所以也许可以选择检查文件是否具有相同的文件大小因此(如果这是正确的单词)。
伪码:
int previoussize = 0;
String previouspath = null;
String Filename = null;
String workDir = "/path/to/workDir ";
String processedDir = "/path/to/processedDir ";
//Loop over all files
for file in workDir
{
//Match
if(file.size() == previoussize)
{
if(previouspath!=null) //skip first loop
{
rm previouspath; //Delete file
}
}
else //No Match
{
/*If there's no match, we can move the previous file
to another directory so it doesn't get checked again*/
if(previouspath!=null) //skip first loop
{
mv previouspath processedDir/Filename;
}
}
previoussize = file.size();
previouspath = file.path();
Filename = file.name();
}
示例:
Qt_2012-03-15_23_00.tgz 10KB
Qt_2012-03-16_00_00.tgz 10KB
Qt_2012-03-16_01_00.tgz 10KB
Qt_2012-03-16_02_00.tgz 15KB
Qt_2012-03-16_03_00.tgz 10KB
Qt_2012-03-16_04_00.tgz 10KB
如果我是正确的,这只会删除前2个而第二个会删除最后一个。应将第三个和第四个移动到processedDir。
所以我想我有两个问题:
我的伪代码会按照我打算的方式工作吗? (我发现这些事情相当令人困惑。)
有更好/更简单/更快的方法吗?因为即使意外删除这样的非同一性的可能性非常小,它仍然是一个机会。
答案 0 :(得分:1)
我可以想到几个选择:
部署版本控制系统,如Git,Subversion等,并编写一个定期检查任何更改的脚本。这将节省大量空间,因为只保存实际更改的文件,并且因为文本文件的更改将存储为差异。
使用增量备份工具。 This article列出了许多替代方案。
通常的做法是将版本控制系统/备份放在不同的计算机上,但您不必这样做。
答案 1 :(得分:0)
不清楚这是否需要批量运行。如果是手动,您可以运行BeyondCompare或任何体面的比较工具来区分两个档案