我有两个版本的庞大而复杂的目录结构,包含数万个单独的文件,我想查找从一个版本到另一个版本的重大文件更改。
每个文件都以一些小的方式发生了变化。例如,您可能有一个名为intro.txt的文件,其中包含
[由Mike 12:00完成构建1057] - (版本1)
[建造1065由迈克18:10完成] - (第2版)
我不关心这样的变化,因为它们不包含任何有用的信息。我也不关心拼写错误的纠正或添加一两个字。
我真正想做的是以更主要的方式提取哪些文件已被更改。他们可能改变的一种方式是添加了许多额外的内容,这会增加文件大小 - 这就是我感兴趣的那种变化。
那么,你将如何递归地解析目录,寻找从一个版本到下一个版本增加(或减少)一定数量的文件。
我正在运行Linux,但几乎任何语言都可以。
答案 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_only和right_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输出的长度与文件的整体大小相关联。
这(除了文件大小比较)会捕获文件中有很多更改但整体文件大小没有显着变化的情况。这可能适用于您的用例,也可能不适用。