以编程方式比较linux中的文件大小

时间:2009-03-09 15:31:53

标签: scripting

我有两个版本的庞大而复杂的目录结构,包含数万个单独的文件,我想查找从一个版本到另一个版本的重大文件更改。

每个文件都以一些小的方式发生了变化。例如,您可能有一个名为intro.txt的文件,其中包含

[由Mike 12:00完成构建1057] - (版本1)

[建造1065由迈克18:10完成] - (第2版)

我不关心这样的变化,因为它们不包含任何有用的信息。我也不关心拼写错误的纠正或添加一两个字。

我真正想做的是以更主要的方式提取哪些文件已被更改。他们可能改变的一种方式是添加了许多额外的内容,这会增加文件大小 - 这就是我感兴趣的那种变化。

那么,你将如何递归地解析目录,寻找从一个版本到下一个版本增加(或减少)一定数量的文件。

我正在运行Linux,但几乎任何语言都可以。

7 个答案:

答案 0 :(得分:4)

CPAN上有几个模块提供此功能。例如。

File :: DirCompare看起来最有希望......

 use File::DirCompare;

 File::DirCompare->compare('dirA', 'dirB', sub {
     my ($a, $b) = @_;

     ... callback runs on different or missing files   ...
     ... so perform extra checks on files $a & $b here ...

 });

因此,显示超过规定字节数的文件的一个例子是....

File::DirCompare->compare('dirA', 'dirB', size_diff_by_more_than(1024) );

sub size_diff_by_more_than {
    my $this = shift;

    return sub {
        my @files = grep { $_ } @_;

        if ( @files == 2 ) {
            # get the two file sizes and report if more than $this
            my @sizes = sort { $a <=> $b } map { (stat)[7] } @files;
            print "Different by more than $this bytes: $files[1]\n"
                if $sizes[1] - $sizes[0] > $this
        }
        else {
            print "Only: $files[0]\n";
        }
    };
}

答案 1 :(得分:3)

在python中,你想从filecmp模块开始。

比较目录 - 然后打印出一侧或另一侧遗失的文件(left_onlyright_only)。

然后,对于diff_files,您需要进行更多详细信息比较 - 使用os.stat找出尺寸,如果差异太大,则打印出文件名。

最后,您需要递归到常见的子目录中。

答案 2 :(得分:2)

我要做一个diff -r -b FOLDER1 FOLDER2来获取已更改的文件列表,然后处理该列表(使用bash脚本就足够了)并检查每个文件的大小差异,并打印文件名差异超过了一个门槛。

-b的{​​{1}}选项用于简短输出,只是为找到的每个差异打印一行,不会打印每行更改。

diff用于对两个目录进行递归比较。

答案 3 :(得分:2)

在bash中:

before_dir=foo.old
after_dir=foo.new
interesting_size=10
for file in `find $before_dir -type f`; do
    diff_size=$(diff -u "$file" "$after_dir$(echo $file | sed "s,$before_dir,,")" | wc -l)
    if [ $diff_size -ge $interesting_size ]; then
        echo $file;
    fi;
done

答案 4 :(得分:2)

您可以生成两个目录的差异,并在其上使用diffstat实用程序。 Diffstat报告已更改文件的统计信息:添加,删除或修改了多少行。我想这会给你提供更多的信息,而不仅仅是比较文件大小。

答案 5 :(得分:2)

在C中,您可以调用文件的统计信息。

#include 
#include 
#include 

int main( int argc, char* argv[] )
{
   struct stat fileInfoA;
   struct stat fileInfoB;

   if( argc == 3 )
   {
     stat( argv[1], &fileInfoA );
     stat( argv[2], &fileInfoB );

     // Now, you can use the following fields of stat to compare the files:
     //      struct stat {
     //          dev_t     st_dev;     /* ID of device containing file */
     //          ino_t     st_ino;     /* inode number */
     //          mode_t    st_mode;    /* protection */
     //          nlink_t   st_nlink;   /* number of hard links */
     //          uid_t     st_uid;     /* user ID of owner */
     //          gid_t     st_gid;     /* group ID of owner */
     //          dev_t     st_rdev;    /* device ID (if special file) */
     //          off_t     st_size;    /* total size, in bytes */
     //          blksize_t st_blksize; /* blocksize for filesystem I/O */
     //          blkcnt_t  st_blocks;  /* number of blocks allocated */
     //          time_t    st_atime;   /* time of last access */
     //          time_t    st_mtime;   /* time of last modification */
     //          time_t    st_ctime;   /* time of last status change */
     //      };

   }

现在,这对比较单个文件很有用。要比较目录中的递归文件,您显然需要使用递归(或堆栈)。您还需要opendir()和readdir()系统调用。

答案 6 :(得分:0)

确定两个文件之间的差异量:

最好运行两个文件的diff并将diff输出的长度与文件的整体大小相关联。

这(除了文件大小比较)会捕获文件中有很多更改但整体文件大小没有显着变化的情况。这可能适用于您的用例,也可能不适用。