디렉토리의 모든 파일에 대한 md5 체크섬 생성


75

디렉토리의 모든 파일에 대해 md5 체크섬 목록을 만들고 싶습니다.

하고 싶습니다 cat filename | md5sum > ouptput.txt. 내 디렉토리의 모든 파일에 대해 1 단계 로이 작업을 수행하고 싶습니다.

도움이 될 것입니다.


특정 백업 파일의 md5sum (체크섬)을 어떻게 찾을 수 있습니까? -내 스크립트는 어떻게

답변:


110

md5sum여러 파일 이름 또는 bash 확장을 전달할 수 있습니다 .

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

화려하게 만들고 싶다면 find파일을 드릴 다운하고 필터링하고 재귀 적으로 작업하는 것과 같은 것을 사용할 수 있습니다 .

find -type f -exec md5sum "{}" + > checklist.chk

1
♦ 얻기를 위해 위의 사용 방법을 md5sum하위 디렉토리 내부의 파일로, 위에서 md5sum *... 말하여 하위 레벨로가는 발광 디렉토리입니다
Kasun Siyambalapitiya

find -type f -exec md5sum '{}' +`find -type f -exec md5sum '{}' 을 (를) 실행하여 요청하여 죄송합니다 . 감사합니다 :)
Kasun Siyambalapitiya

이 출력의 모양을 더 선호합니다 :openssl md5 * > checklist.txt
ashley

1
**재귀 적 으로 평가할 수있는 쉘 (예 : zsh)을 사용하는 경우 훨씬 간단합니다.md5sum **/* 2>/dev/null
Joost

12

훌륭한 체크섬 생성 / 검증 프로그램은 Rash입니다. SFV 호환 파일도 생성하고 확인합니다.

md4, md5, sha1, sha512, crc32 및 기타 여러 가지를 지원합니다.

또한 md5deep 또는 sha1deep과 같은 재귀 생성 (-r 옵션)을 수행 할 수 있습니다.

마지막으로 체크섬 파일의 출력 형식을 지정할 수 있습니다. 예를 들면 다음과 같습니다.

rhash --md5 -p '%h,%p\n' -r /home/

/home디렉토리 부터 재귀 적으로 전체 파일 경로를 포함한 CSV 파일을 출력합니다 .

crc32 sum을 이름에 삽입하여 -e 옵션으로 파일 이름을 바꾸는 것도 매우 유용합니다.

PhoenixNL72 예제에서 "rhash"를 사용하여 "md5sum"을 변경할 수 있습니다.


1
여기서 '/ home /'은 정확히 무엇을합니까? 이 도구는 꽤 좋아 보입니다.
Andy Ibanez

나는 그것이 오류라고 생각합니다. -p는 출력 형식입니다. 내가 고칠 게
pbhj

7

다음은보다 광범위한 두 가지 예입니다.

  1. 절대 경로를 사용하여 아직없는 md5 파일을 각 디렉토리에 작성하십시오.

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. 경로가없고 파일 이름 만있는 md5 파일을 각 폴더에 만듭니다.

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

1과 2의 차이점은 결과 md5 파일에 파일이 표시되는 방식입니다.

명령은 다음을 수행합니다.

  1. 현재 폴더의 디렉토리 이름 목록을 작성하십시오. (나무)
  2. 폴더 목록을 정렬하십시오.
  3. @ md5sum.md5 파일이 존재하면 각 디렉토리를 확인하십시오. 존재하는 경우 출력을 건너 뛰고 존재하지 않는 경우 출력 처리합니다.
  4. @ md5Sum.md5 파일이 없으면 md5Sum은 폴더에있는 모든 파일의 체크섬이있는 파일을 생성합니다. 5) 생성 된 @ md5Sum.md5 파일을 읽기 전용으로 설정하십시오.

이 전체 스크립트의 출력을 파일 (.....; done> test.log)로 리디렉션하거나 다른 프로그램 (예 : grep)으로 파이프 할 수 있습니다. 출력은 건너 뛴 디렉토리와 처리 된 디렉토리 만 알려줍니다.

성공적으로 실행되면 현재 디렉토리의 각 하위 디렉토리에 @ md5Sum.md5 파일이 생깁니다.

파일 이름을 @ md5Sum.md5로 지정하여 samba 공유의 디렉토리 맨 위에 나열됩니다.

다음 명령으로 모든 @ md5Sum.md5 파일을 확인할 수 있습니다.

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

나중에 grep -v OK를 사용하여 checklog.txt를 grep하여 다른 모든 파일 목록을 얻을 수 있습니다.

특정 디렉토리에서 @ md5Sum.md5를 재생성하려면 예를 들어 파일을 변경하거나 추가 한 경우 @ md5Sum.md5 파일을 삭제하거나 파일 이름을 바꾸고 generate 명령을 다시 실행하십시오.


전체 경로를 사용하는 명령 # 1 : md5sum "$ {dir}"/ *가 점으로 시작하는 숨겨진 파일을 선택하지 않습니다. 어떤 치료법?
user14654

파티에 늦었지만 md5sum은 파일 이름을 원하기 때문에 (디렉토리를 지정하면 행복해 보인다) $ md5sum $ (find "$ dir"-maxdepth 0 -type f) "- f "유형은 일반 및 .hidden 파일을 가져옵니다 (또한 찾기에는 많은 옵션이 있지만 매우 유용 할 수 있음). 모든 것을 재귀 적으로 원하면 "-maxdepth 0"부분을 생략하십시오. 참고 : 파일 이름에 공백이 있으면 깨지기 쉽습니다. xargs 및 -0 ( en.wikipedia.org/wiki/Xargs ) 에서 읽을 수 있습니다.
jgreve

0

나는이 문제에 부딪 쳤고 위의 솔루션은 우아하지만이 상황에 대한 빠르고 더러운 해킹을 원했습니다. 하위 디렉토리가 한 수준 깊은 하위 디렉토리가있는 1 개의 디렉토리

따라서 쉘에 디렉토리를 입력하고 다음을 실행하십시오.

md5sum * */* 2>/dev/null > md5sum.md5

그러면 최상위 디렉토리의 모든 파일을 가져 와서 디렉토리 인 하위 디렉토리에 대한 오류 경고를 제거한 다음 서브 디렉토리 컨텐츠에서 md5sums를 실행합니다. 장점 : 기억하기 쉽고 정확히해야 할 일을합니다. 나는 항상 구문 찾기로 혼란스러워 머리 꼭대기에서 그것을 기억할 수 없으므로 디렉토리 이름의 공백을 처리하는 등을 반복 할 필요가 없습니다.이 라이너는 정상적으로 작동했습니다. 강력하고 강력한 솔루션은 아니지만 1 수준 이상의 하위 디렉토리에는 적합하지 않지만 문제를 빠르고 쉽게 해결할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.