md5sum이 공백이 포함된 파일 이름을 이해하도록 합니다.

md5sum이 공백이 포함된 파일 이름을 이해하도록 합니다.

md5sum여러 .mp3 파일에 대한 체크섬을 계산하려면 Python에서 파이프를 사용해야 합니다 . 프로그램 명령줄에서 파일 이름의 공백을 무시하는 명령이 있습니까 md5sum?

예를 들어:

import os
def index(directory):
    stack = [directory]
    files = []
    while stack:
        directory = stack.pop()
        for file in os.listdir(directory):
            fullname = os.path.join(directory, file)
            if fullname.endswith('mp3'):
                files.append(fullname)
            if os.path.isdir(fullname) and not os.path.islink(fullname):
                stack.append(fullname)
    return files

def check(directory):
    files = index(directory)
    hvalues = []
    for x in files:
        cmd = 'md5sum' + ' ' + x
        fp = os.popen(cmd)
        res = fp.readline()
        hvalues.append(res)
        stat = fp.close() # What to do with stat?
    return hvalues

cmd = 'md5sum' + ' ' + x"md5sum" 도구에는 파일 이름에 공백이 포함된 파일을 올바르게 처리(해시)하는 기능이 없기 때문에 공백이나 특수 문자가 포함된 파일에서는 명령이 제대로 작동하지 않습니다.

답변1

@binfalse가 지적했듯이 문제는 프로그램이 아니라 md5sum호출 방식입니다. 귀하의 코드는 실제로 여러 수준에서 좋지 않습니다.

  1. 이스케이프하지 않고 쉘 명령을 어셈블합니다. 최악의 경우, 파일 이름 중 하나가 교묘하게 만들어지면 완전히 예상치 못한 명령이 실행될 수 있습니다. 일회성 스크립트를 작성하지 않는 한 그것은 끔찍할 것입니다.

  2. 해야 한다os.popen() 기능에는더 이상 사용되지 않음파이썬 2.6부터 시작합니다. 권장되는 대안은 다음과 같습니다.subprocess.Popen(). args앞에서 언급한 셸 이스케이프 문제를 방지하려면 연결 문자열 대신 목록을 인수로 전달해야 합니다 .

    def check(directory):
        files = index(directory)
        hvalues = []
        for f in files:
            cmd = ['md5sum', f]
            proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
            hvalues.append(proc.stdout.readline())
            proc.stdout.close()
            stat = os.waitpid(proc.pid, 0)
        return hvalues
    
  3. 더 나은 방법은 Python을 사용하는 것입니다.hashlib해시 값을 계산합니다.

답변2

이는 기능 부족 md5tool이 아니라 일반적인 명령줄 제한 사항입니다. 매개변수는 공백으로 구분됩니다. 따라서 공백이 포함된 파일 이름을 전달하면 md5sum각 토큰이 단일 파일로 해석됩니다. 파일 이름을 따옴표로 묶어서 이 문제를 해결할 수 있습니다. 즉, 줄을 바꿔보세요.

cmd = 'md5sum' + ' ' + x

그리고

cmd = 'md5sum' + ' "' + x + '"'

명령줄 호출은 다음과 같습니다.

md5sum "file name with spaces.mp3"

따라서 md5sum해시는 불평 없이 계산됩니다.

관련 정보