2016-06-01 4 views
0

imagenet 파일 (here이 차 이미지의 예입니다)에서 제공하는 URL에서 wget 명령을 사용하여 많은 파일을 다운로드했습니다. 그러나 내 파일을 검사 할 때 파일이 많다는 것을 알았습니다. 잘못된 확장자가 있습니다. 예를 들어, 파일 중 확장명이 '.jpg'인 파일은 실제로 텍스트 파일입니다. 그리고 --adjust-extension은 .html과 .css 파일에서만 잘 작동한다는 것을 알고 있습니다.셸 파일 확장자를 수정하고 중복을 제거하는 방법

내 질문에 그 파일이 있습니다 : 1. 어떻게 파일 확장자 (.jpg, .txt, .png, .html 등)를 복구 할 수 있습니까? 2. 이미지 중 일부가 두 번 이상 다운로드 될 수 있습니다. 중복을 제거하는 방법은 무엇입니까?

파이썬으로 할 수 있다면 잘됩니다. 미리 감사드립니다.

+1

파일 확장자가 엉망인 경우 유닉스 프로그램'file'을 사용하여 적절한 파일 유형을 파악할 수 있습니다. 사용법은 쉘에서'man file'을 실행하십시오. –

+1

내용의 체크섬을 사용하거나 2 단계 로켓을 만들고 파일 크기를 먼저 확인하고 두 개가 일치하면 내용의 체크섬을 수행하여 일치하는지 확인할 수 있습니다. – Torxed

답변

2

콘텐츠를 기반으로 파일을 식별하는 방법을 제공하는 python-magic https://github.com/ahupp/python-magic 또는 filemagic https://pypi.python.org/pypi/filemagic과 같은 패키지를 사용할 수 있습니다. Unix file 명령은 --mime-type 플래그를 사용하여 파일 유형을 찾는 단어도 명령합니다.

중복에 관해서는,이 작업을 수행하는 많은 유틸리티가 있지만, 이런 식으로 뭔가를 갈 것이라고 파이썬에서 그것을 할 :

import os, hashlib 

def remove_dupes(dir): 
    unique = set() 
    for filename in os.listdir(dir): 
     if os.path.isfile(filename): 
      filehash = hashlib.sha1(file(filename).read()).hexdigest() 
      if filehash not in unique: 
       unique.add(filehash) 
      else: 
       os.remove(filename) 
+0

감사합니다. 파이프에서'file' 명령을 사용할 수 있습니까? 다음과 같은 방법을 시도했지만 작동하지 않았습니다.'find ./aircon/ -name '*'| file -i' – Tengerye

+0

표준 입력을받는 파일이 없으므로 xargs를 다음과 같이 사용해야합니다 :'find/path/to/file -name 'filename'-print0 | xargs -0 file -i' – shenk

+0

'-f' 플래그를 사용하여 파일 이름 목록에서 파일을 사용할 수 있습니다. 목록은'-f -'로 표시된 stdin (파이프)에서 올 수 있습니다. 따라서'find ./aircon/ -name '*' '을 사용할 수 있습니다. file -if -' –

1

당신은에 따라 파일 형식을 파악하기 위해 file 프로그램을 사용할 수 있습니다 파일 이름 대신 파일 내용. 파일에는 BSD와 OSX를 포함한 리눅스와 유닉스의 거의 모든 버전이 함께 제공됩니다. Windows를 사용한다면 Cygwin에 포함되어 있다고 생각합니다.

플래그가 -i이면 출력을 mimetype으로 얻고 표준 라이브러리의 mimetypes 모듈을 사용하여 mimetype을 적절한 파일 확장자에 매핑 할 수 있습니다. 이 기능은 많은 파일 형식에서 잘 작동합니다.

이 샘플은 Linux에서 python 3으로 작동합니다. 현재 디렉토리의 각 파일과 가능한 파일 확장명 목록을 출력합니다.

import os, mimetypes, subprocess 
for filename in os.listdir(): 
    mime = subprocess.check_output(['file', '-ib', filename]).decode().split(';')[0] 
    print(filename, mimetypes.guess_all_extensions(mime.strip())) 
+0

mimetypes 라이브러리의 좋은 사용을 생각하지 않았습니다. – shenk

+0

대단히 감사합니다. 마지막 줄의'print (filename, mimetypes.guess_all_extensions (mime))'는'print (filename, mimetypes.guess_all_extensions (mime [: - 1]))'이어야한다. 그렇지 않으면 출력은 비게된다. mime의 내용은'u'text/html \ n ''과 유사합니다. – Tengerye

+0

예.내가 테스트 할 때 후행 줄 바꿈을 얻지는 못했지만 파이썬 2와는 다른 것일까? 어쨌든'mime.strip()'을 사용하는 것이 더 안전합니다. 공백 문자 만 제거합니다. 나는 그 대답을 업데이트 할 것이다. –

관련 문제