파일 이름을 해시의 처음 N자로 바꾸는 단일 명령

파일 이름을 해시의 처음 N자로 바꾸는 단일 명령

저는 macOS 모하비를 사용하고 있습니다.

나는 내 사이트에 이미지를 추가할 때 이미지 이름을 지정하는 것을 싫어합니다(Jekyll, 관심 있는 분들을 위한 정보). 대신, 파일 내용을 기반으로 해시를 생성하고 해시의 첫 N자를 파일 이름으로 사용하는 것이 합리적인 전략이라고 생각합니다. 이 전략은 Amazon S3 및 CloudFront를 통해 웹 사이트를 제공할 때 자산 버전 관리에도 도움이 됩니다.

파일이 주어지면 somescreenshot.png이 TBD 명령을 실행하고 결과는 이름이 변경된 파일입니다 8dbm2hz1.png.

진전

나는 이에 대해 진전을 이루었지만 현재는 다단계 접근 방식입니다.

  1. 해시를 생성하고 처음 8자를 가져와 클립보드로 보냅니다.
    shasum -a 256 -b inputfile.png | head -c8 | pbcopy
  2. 파일 이름을 바꿉니다.
    mv inputfile.png [paste from #1]

이 명령을 효율적인 파이프라인 단일 단계 프로세스로 만들어야 합니다.

답변1

왜 사용하지 않습니까:

mv -- inputfile.png "$(shasum -a 256 -b inputfile.png | head -c8)"

$(shasum -a 256 -b inputfile.png | head -c8)파일이 해시 값의 처음 8자의 출력으로 이동됩니다.

답변2

명령 대체를 사용하여 해시 값을 쉘 변수에 저장하십시오.

file=inputfile.png
h=$(shasum -a 256 -b "$file" | head -c8)

그런 다음 이를 사용하여 이름을 바꾸거나, 터미널로 인쇄하거나, 로 보내 pbcopy거나, 다른 작업을 수행할 수 있습니다.

mv -- "$file" "$h"
echo "$h" | pbcopy
echo "'$file' renamed to '$h'"

파일 확장자를 유지하려면 다음과 같이 사용하십시오.

newname=$h.${file##*.}
mv -- "$file" "$newname"

( ${var##*.}마지막 지점까지 모두 삭제하세요.)

답변3

이름을 바꾸고 싶다면모두파일을 만든 다음 xargs를 사용하세요. 이것은 GNU 도구의 진언입니다. 해당 옵션이 존재하는지 확인하려면 매뉴얼 페이지를 확인하세요.

printf "%s\0" * |
    xargs -0 -I{} sh -c 'echo mv "$1" "$(shasum -a 256 -b "$1"| head -c8)"' sh {} 

이는 널 바이트를 사용하여 파일 이름을 구분하므로 공백이 포함된 파일 이름을 안전하게 처리할 수 있습니다.

echo실제로 파일을 이동하려면 명령을 제거해야 합니다.

관련 정보