检查档案是否相同

时间:2012-03-16 23:03:33

标签: java

我正在使用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。

所以我想我有两个问题:

  1. 我的伪代码会按照我打算的方式工作吗? (我发现这些事情相当令人困惑。)

  2. 有更好/更简单/更快的方法吗?因为即使意外删除这样的非同一性的可能性非常小,它仍然是一个机会。

2 个答案:

答案 0 :(得分:1)

我可以想到几个选择:

  • 部署版本控制系统,如Git,Subversion等,并编写一个定期检查任何更改的脚本。这将节省大量空间,因为只保存实际更改的文件,并且因为文本文件的更改将存储为差异。

  • 使用增量备份工具。 This article列出了许多替代方案。

通常的做法是将版本控制系统/备份放在不同的计算机上,但您不必这样做。

答案 1 :(得分:0)

不清楚这是否需要批量运行。如果是手动,您可以运行BeyondCompare或任何体面的比较工具来区分两个档案