문제

저는 File::Find를 사용하여 네트워크 파일 시스템을 색인화하는 Perl 스크립트(Windows)를 작성하고 있습니다.훌륭하게 작동하지만 파일 시스템을 크롤링하는 데 시간이 매우 오래 걸립니다.나는 디렉토리를 탐색하기 전에 어떻게든 디렉토리의 체크섬을 얻는 것이 좋을 것이라고 생각했습니다. 그리고 체크섬이 이전 실행에서 얻은 체크섬과 일치하면 디렉토리를 탐색하지 마십시오.이 파일 시스템의 파일은 자주 변경되지 않으므로 이렇게 하면 많은 처리 작업이 제거됩니다.

내 AIX 상자에서는 다음 명령을 사용합니다.

csum -h MD5 /directory

이는 다음과 같은 것을 반환합니다.

5cfe4faf4ad739219b6140054005d506  /directory

이 명령은 시간이 거의 걸리지 않습니다.

time csum -h MD5 /directory
5cfe4faf4ad739219b6140054005d506  /directory

real    0m0.00s
user    0m0.00s
sys     0m0.00s

이 작업을 수행할 모듈을 찾기 위해 CPAN을 검색했지만 모든 모듈이 디렉토리 자체가 아닌 디렉토리의 모든 파일에 대해 MD5sum을 제공하는 것 같습니다.

Perl의 디렉토리에 대한 MD5sum을 얻을 수 있는 방법이 있습니까? 아니면 Windows에서도 Perl에서 Win32 명령을 호출할 수 있습니까?

미리 감사드립니다!

도움이 되었습니까?

해결책

파일과 폴더의 마지막 수정 날짜를 읽을 수 있습니까? 분명히 그것은 MD5를 만드는 것보다 더 빠를 것입니까?

다른 팁

체크섬을 얻으려면 파일을 읽어야합니다. 이것은 파일 시스템을 걸어야한다는 것을 의미합니다. 이는 당신이 나가려는 동일한 보트에 다시 넣습니다.

내가 아는 바에 따르면 디렉토리의 MD5를 얻을 수 없습니다. 다른 시스템의 MD5SUM은 디렉토리를 제공 할 때 불만을 제기합니다. CSUM은 트리를 가로 지르지 않고 최상위 디렉토리의 디렉토리 파일 내용의 해시를 제공 할 가능성이 높습니다.

파일의 수정 된 시간을 잡고 다음과 같은 일을함으로써 원하는 방식을 해시 할 수 있습니다.

sub dirModified($){
    my $dir = @_[0];
    opendir(DIR, "$dir");
    my @dircontents = readdir(DIR);
    closedir(DIR);

    foreach my $item (@dircontents){
        if( -f $item ){
            print -M $item . " : $item - do stuff here\n";
        } elsif( -d $item && $item !~ /^\.+$/ ){
            dirModified("$dir/$item");
        }
    }
}

예, 실행하는 데 시간이 걸릴 것입니다.

다른 좋은 답변 외에도 다음을 추가하겠습니다.당신이 원한다면 체크섬, 그런 다음 체크섬 알고리즘 ( 대신고장난!) 해시 함수.

파일 인덱서에 암호화된 보안 해시 함수가 필요하지 않다고 생각합니다. 대신 전체 목록을 저장하지 않고 디렉터리 목록에 변경 사항이 있는지 확인할 수 있는 방법이 필요합니다.체크섬 알고리즘은 다음을 수행합니다.입력이 변경되면 다른 출력을 반환합니다.해시 함수보다 간단하기 때문에 더 빨리 수행할 수 있습니다.

사용자가 체크섬에 의해 발견되지 않는 방식으로 디렉토리를 변경할 수 있다는 것은 사실입니다.그러나 파일 이름이 정상적으로 변경되면 (확률이 높음) 다른 체크섬이 제공되므로 사용자는 의도적으로 이와 같은 파일 이름을 변경해야 합니다.그렇다면 이 "공격"에 대비하는 것이 필요합니까?

항상 각 공격의 결과를 고려하고 적절한 도구를 선택해야 합니다.

관심이 있다면 파이썬 에서이 중 하나를했습니다.

http://akiscode.com/articles/sha-1directoryhash.shtml

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top