디렉터리의 모든 파일에 대해 MD5sum을 생성한 다음 MD5SUM 파일이 포함된 각 파일에 대해 (파일 이름).md5를 작성합니다.

디렉터리의 모든 파일에 대해 MD5sum을 생성한 다음 MD5SUM 파일이 포함된 각 파일에 대해 (파일 이름).md5를 작성합니다.

파일로 가득 찬 디렉토리가 있습니다. 각 파일은 특정 유형의 대상 호스트에 복사됩니다.

디렉터리에 있는 모든 파일의 MD5 합계를 계산하고 합계가 생성된 파일 이름과 일치하지만 .md5가 추가된 파일에 해당 md5 합계를 저장하고 싶습니다.

예를 들어 디렉토리가 있다고 가정해 보겠습니다.

a.bin
b.bin
c.bin

최종 결과는 다음과 같습니다.

a.bin
a.bin.md5     # a.bin's calculated checksum
b.bin
b.bin.md5     # b.bin's calculated checksum
c.bin
c.bin.md5     # c.bin's calculated checksum

이 작업을 수행하기 위해 find exec 및 xargs를 사용해 보았습니다.

find를 사용하여 다음 명령을 시도했습니다.

find . -type f -exec md5sum {} + > {}.md5

xargs를 사용하여 다음 명령을 시도했습니다.

find . -type f | xargs -I {} md5sum {} > {}.md5

두 경우 모두, 결국 제가 원하는 것은 아닌 {}.txt라는 파일이 생성됩니다.

내가 만들고 싶은 md5 파일을 생성하기 위해 이를 조정하는 방법을 알려줄 수 있는 사람이 있나요?

답변1

cd /path/to/files &&
for file in *; do
    if [[ -f "$file" ]]; then
        md5sum -- "$file" > "${file}.md5"
    fi
done

답변2

리디렉션은 쉘의 연산자입니다.

존재하다:

find some args  > {}.md5

find일부 매개변수를 사용하여 실행하면 표준 출력이 로 리디렉션됩니다 {}.md5.

find여기에서 파일당 리디렉션을 수행하려면 셸을 시작 해야 합니다 .

find . -type f -exec sh -c '
  for file do
    md5sum "$file" > "$file.md5"
  done' sh {} +

해당 섹션에서 디렉터리 구성 요소를 피하려면 많은 구현에서 지원되는 대안을 .md5사용할 수 있습니다 (일부 구현의 경우 여전히 디렉터리 구성 요소를 얻을 수 있고 일부의 경우 각 실행에 대해 여전히 디렉터리 구성 요소를 얻을 수 있음). 파일 :-execdirfind./{} +

find . -type f -execdir sh -c '
  for file do
    md5sum "$file" > "$file.md5"
  done' sh {} +

아니면 이렇게 할 수도 있습니다:

find . -type f -exec sh -c '
  for file do
    (cd "${file%/*" && exec md5sum -- "${file##*/}") > "$file.md5"
  done' sh {} +

답변3

while 루프에 파이프를 연결하면 부작용이 있다는 것을 알고 있지만 이 솔루션의 단순성, 가독성 및 확장성이 마음에 듭니다.

find . -type f ! -name \*.md5 |\
  while read a; do md5sum $a > $a.md5; done

단순히 합계를 확인하려면 다음 scipplet을 사용하십시오.

find . -type f ! -name \*.md5 |\
  while read a; do echo $a; md5sum -c $a.md5; done

답변4

cd /path/to/files && ls -1| xargs md5sum |  xargs -l bash -c 'echo $0"  "$1 > $1.md5'

첫 번째 xargs가 생성되고 두 번째 xargs가 선택되어 .md5에 저장됩니다.

파일 패턴을 필터링해야 하는 경우 ls를 find로 바꾸거나 그 뒤에 grep을 추가할 수 있습니다.

관련 정보