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
호출 방식입니다. 귀하의 코드는 실제로 여러 수준에서 좋지 않습니다.
이스케이프하지 않고 쉘 명령을 어셈블합니다. 최악의 경우, 파일 이름 중 하나가 교묘하게 만들어지면 완전히 예상치 못한 명령이 실행될 수 있습니다. 일회성 스크립트를 작성하지 않는 한 그것은 끔찍할 것입니다.
해야 한다
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
더 나은 방법은 Python을 사용하는 것입니다.
hashlib
해시 값을 계산합니다.
답변2
이는 기능 부족 md5tool
이 아니라 일반적인 명령줄 제한 사항입니다. 매개변수는 공백으로 구분됩니다. 따라서 공백이 포함된 파일 이름을 전달하면 md5sum
각 토큰이 단일 파일로 해석됩니다. 파일 이름을 따옴표로 묶어서 이 문제를 해결할 수 있습니다. 즉, 줄을 바꿔보세요.
cmd = 'md5sum' + ' ' + x
그리고
cmd = 'md5sum' + ' "' + x + '"'
명령줄 호출은 다음과 같습니다.
md5sum "file name with spaces.mp3"
따라서 md5sum
해시는 불평 없이 계산됩니다.