代码之家  ›  专栏  ›  技术社区  ›  WalkingRandomly

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

  •  3
  • WalkingRandomly  · 技术社区  · 16 年前

    我有两个版本的非常大和复杂的目录结构,有成千上万个单独的文件,我想寻找从一个版本到另一个版本的重大文件更改。

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

    [Build 1057由Mike 12:00完成](版本1)

    我不关心这样的更改,因为它们不包含有用的信息。我也不在乎拼写错误的更正或添加一两个单词。

    我真正想做的是找出哪些文件以更大的方式发生了更改。他们可能改变的一种方式是添加了很多额外的内容,这会增加文件大小——这就是我感兴趣的改变。

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

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

    7 回复  |  直到 6 年前
        1
  •  4
  •   AndyG    8 年前

    CPAN上有几个模块提供了这一点。例如。

    文件::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";
            }
        };
    }
    
        2
  •  3
  •   Douglas Leeder    16 年前

    filecmp 单元

    比较目录-然后打印出一方或另一方缺少的文件( left_only right_only ).

    那么对于 diff_files os.stat 找出大小,如果差异太大,则打印文件名。

    最后,您需要递归到公共子目录中。

        3
  •  2
  •   unwind    16 年前

    diff -r -b FOLDER1 FOLDER2 要获取已更改文件的列表,请处理该列表(使用bash脚本即可),只需检查每个文件的大小差异,如果差异超过阈值,则打印文件名。

    -b 选择 diff 对于简短的输出,它只为发现的每个差异打印一行,而不打印每行更改。

    这个 -r

        4
  •  2
  •   Daniel Watkins    16 年前

    在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
    
        5
  •  2
  •   Eugene Morozov    16 年前

    diffstat 它的效用。Diffstat报告更改文件的统计信息:添加、删除或修改了多少行。我想这会给你更多的信息,而不仅仅是比较文件大小。

        6
  •  2
  •   dicroce    16 年前

    在C语言中,对文件调用stat。

    #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 */
         //      };
    
       }
    

        7
  •  0
  •   user55400    16 年前

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

    最好运行两个文件的diff,并将diff输出的长度与文件的总体大小联系起来。

    这(除了文件大小比较之外)将捕获文件中有大量更改但总体文件大小没有显著更改的情况。这可能适用于您的用例,也可能不适用于您的用例。