일부 파일의 이름을 해당 내용의 MD5 합계로 바꾸고 싶습니다. 예를 들어 파일이 foo
비어 있으면 이름을 d41d8cd98f00b204e9800998ecf8427e
.
스크립트여야 합니까, 아니면 rename
도구 같은 것을 사용할 수 있습니까?
답변1
Glenn의 답변은 훌륭합니다. 다중 문서가 개선되었습니다.
md5sum file1 file2 file3 | # or *.txt, or whatever
while read -r sum filename; do
mv -v "$filename" "$sum"
done
파일이나 유사한 파일을 만드는 경우 find
호출을 md5sum
이와 유사한 것으로 바꿀 수 있습니다 find . <options> -print0 | xargs -0 md5sum
(출력도 셸 루프로 파이프됩니다).
md5sum
이것은 여러 줄과 합계, 해당 파일로 구성되고 각 줄을 읽고 파일 이름을 원래 이름에서 sum으로 바꾸는 명령을 실행하는 쉘 루프로 파이프되는 출력입니다 mv
. 동일한 양의 파일은 덮어쓰게 됩니다. 그러나 이상한 일이 발생하지 않는 한(예: md5 해시 충돌을 처리하는 경우) 이는 해당 파일의 내용이 동일하므로 어쨌든 데이터가 손실되지 않는다는 것을 의미합니다. 각 파일에 추가 작업을 도입해야 하는 경우 원본 파일 이름과 MD5 합계가 각각 포함된 $filename
및 변수를 참조하여 루프에 넣을 수 있습니다 .$sum
답변2
그리고 zsh
:
autoload zmv # best in ~/.zshrc
zmv '**/*(#qD.)' '$(md5sum<$f)'
모든 일반 파일의 이름은 재귀적으로 변경됩니다.
(동일한 디렉터리에 있는 두 파일의 체크섬이 동일한 경우 파일 이름 바꾸기를 거부하므로 -f
덮어쓰도록 추가하세요.)
**/*(#qD.)
glob 한정자가 is 인 재귀 glob zsh
(명시적 형식은 (#q<qualifiers>)
, D
숨겨진 파일 포함, .
선택만 가능)정기적인문서.
답변3
큰 타격:
md5sum my.file.here | { read sum filename; mv $filename $sum; }