2009-03-09 4 views
3

수십만 개의 개별 파일이있는 매우 크고 복잡한 디렉토리 구조의 두 가지 버전이 있는데 한 버전에서 다른 버전으로의 중요한 파일 변경 사항을 찾고 싶습니다.리눅스에서 프로그램 적으로 파일 크기 비교

각각의 모든 파일이 약간 변경되었습니다. (버전 - (버전 1)

[1065 마이크 18시 10분 수행 빌드가] - 예를 들어, 당신은

는 [마이크 12:00 일 1057 빌드] 포함됩니다라는 파일 intro.txt이있을 수 있습니다 2)

유용한 정보가 없으므로 변경 사항은 신경 쓰지 않습니다. 또한 맞춤법 오류에 대한 수정이나 한두 단어의 추가에 대해서는 신경 쓰지 않습니다.

내가 정말로하고 싶은 것은 어떤 파일이 더 중요한 방식으로 변경 되었습니까? 그들이 변경했을 수있는 한 가지 방법은 파일 크기를 늘릴 수있는 많은 추가 콘텐츠를 추가하는 것입니다. 관심있는 변경 사항입니다.

그래서 어떻게 파일을 찾는 디렉토리를 재귀 적으로 파싱할까요? 한 버전에서 다음 버전으로 설정된 금액만큼 증가 (또는 감소) 한 것입니다.

저는 리눅스를 사용하고 있지만 거의 모든 언어가 지원할 것입니다.

답변

3

파이썬에서 filecmp 모듈로 시작하고 싶습니다.

디렉토리를 비교 한 다음 한쪽 또는 다른 쪽에서 누락 된 파일 (left_onlyright_only)을 인쇄하십시오.

diff_files에 대해서는 더 자세한 비교가 필요합니다. os.stat을 사용하여 크기를 확인하고 차이가 너무 큰 경우 파일 이름을 출력하십시오.

마지막으로 일반적인 하위 디렉터리로 돌아갈 필요가 있습니다.

+0

시작하기에 충분합니다. –

+0

감사합니다. Doug - 시작하기에 충분 해 보입니다. 언어에 자유 범위를 부여했지만, 첫 번째 대답은 Python을 참조 할 것이라고 생각했습니다. :) – WalkingRandomly

2

변경된 파일 목록을 얻으려면 bash 스크립트를 사용하는 것으로 충분하며 각 파일의 크기 차이를 확인하고 차이가 초과되면 파일 이름을 출력하십시오 임계 값.

diff에 대한 -b 옵션은 간략한 출력을 위해 발견 된 각 차이에 대한 행을 인쇄하고 행당 변경 사항을 인쇄하지 않습니다.

-r은 종종 두 디렉토리를 반복적으로 비교하기위한 것입니다. 배쉬에서

2

이 제공 CPAN에 대한 몇 가지 모듈이 있습니다

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

. 예를 들면. File::DirCompare

파일 :: 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"; 
     } 
    }; 
} 
당신은 두 개의 디렉토리의 DIFF를 생성하고, diffstat을 사용할 수 있습니다
2

그것에 대한 유틸리티. Diffstat은 변경된 파일에 대한 통계를보고합니다. 추가, 제거 또는 수정 된 줄 수. 나는 이것이 파일 크기를 비교하는 것보다 더 많은 정보를 줄 것이라고 생각합니다. 두 파일 사이의 차이의 양을 결정하는 점에

0

:

두 파일은 diff를 실행하고 파일의 전체 크기와 관련은 diff 출력의 길이를 넣어하는 것이 좋을 것입니다 .

(파일 크기 비교 이외에도) 파일에 많은 변경이 있었지만 전체 파일 크기가 크게 변경되지 않은 경우를 파악할 수 있습니다. 이는 사용 사례에 따라 적절할 수도 있고 그렇지 않을 수도 있습니다.

2

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

    } 

이제 개별 파일을 비교하는 데 유용합니다. 디렉토리의 파일을 재귀 적으로 비교하려면 재귀 (또는 스택)를 사용해야 할 것입니다. 또한 opendir() 및 readdir() 시스템 호출이 필요합니다.

관련 문제