디렉터리의 각 폴더에 대해 단일 체크섬을 계산하는 방법은 무엇입니까?

디렉터리의 각 폴더에 대해 단일 체크섬을 계산하는 방법은 무엇입니까?

서버와 클라이언트 시스템 사이의 두 개의 큰 디렉토리를 비교하고 있습니다. 두 디렉터리가 동일한지 확인하기 위해 아래 명령과 유사한 명령을 실행합니다.

find /path/to/dir/ -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum

그러나 서로 다른 경우 상위 디렉터리 아래의 모든 디렉터리와 파일에 대해 유사한 명령을 실행하려면 한 수준 아래로 내려가야 합니다. "for 루프"를 작성할 수 있지만 전체 디렉터리에 대한 체크섬을 계산하는 더 효율적인 방법이 있는지 알고 싶습니다. 이를 통해 서버/클라이언트 시스템 간의 비교를 더 쉽게 할 수 있습니다.

참고: 폴더의 개별 체크섬은 해당 디렉터리에 포함된 파일의 체크섬을 반영합니다.

나는 다음과 같은 것을 상상합니다.

$ checksumForDir /path/to/dir/*
/path/to/dir/a/  18fad1ea8141fd1
/path/to/dir/b/  17fad1ea8141fd1
/path/to/dir/c/  94fad1ea8141fd1

지금까지 상위 디렉터리에서 체크섬 목록을 가져오는 한 줄의 코드를 작성했지만 디렉터리 이름을 병합할 수는 없습니다.

$ ls -d1 /parentDir/*/ | xargs -I {} sh -c 'find "{}" -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum'
29ce013658a00862338ac848c2f90b2e18853a01  -
8f208342084950297b1376f669a9a3c93beca790  -
ae7f589d40f9222d1b06094d0c2f68649fb6cf08  -

답변1

제가 찾은 가장 좋은 방법은 다음 명령을 사용하는 것입니다.

$ ls -d1 /path/to/dir/*/ | xargs -I {} sh -c 'echo -n "{} " && find "{}" -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum'
/path/to/dir/a/  18fad1ea8141fd1 -
/path/to/dir/b/  17fad1ea8141fd1 -
/path/to/dir/c/  94fad1ea8141fd1 -

조금 복잡해 보이지만 아직 더 나은 방법을 찾지 못했습니다.

관련 정보