2016-06-01 7 views
0

imagenetファイル(hereは車の画像の例です)から提供されたURLからwgetコマンドを使用してたくさんのファイルをダウンロードしました。しかし、私は私のファイルをチェックすると、私は多くのファイルが見つかりました、間違った拡張子があります。たとえば、ファイルの中で、拡張子が.jpgのファイルは実際にはテキストファイルです。そして、--adjust-extensionは.htmlと.cssファイルでのみうまくいくかもしれないことに気付いています。シェルファイルの拡張子を修正して複製を取り除く方法

私の質問はそれらのファイルです:1.どのようにファイルの拡張子(.jpg、.txt、.png、.htmlなど)を回復することができますか? 2.いくつかの画像が複数回ダウンロードされることがあります。重複を取り除くにはどうすればいいですか?

もしPythonで実行できるのであれば、それでも問題ありません。 ありがとうございます。

+1

ファイル拡張子が壊れている場合は、適切なファイルタイプを調べるためにUNIXプログラム 'file'を使用できます。使い方は、あなたのシェルから 'man file'を実行してください。 –

+1

コンテンツのチェックサムを使用することも、2ステップのロケットを作成して最初にファイルサイズを確認し、2つの一致がコンテンツのチェックサムを行い、一致するかどうかを確認することもできます。 – Torxed

答えて

2

python-magic https://github.com/ahupp/python-magicやfilemagic https://pypi.python.org/pypi/filemagicのようなパッケージを使用して、コンテンツに基づいてファイルを識別する方法を提供できます。 Unix fileコマンドは--mime-typeフラグを指定してファイルタイプを検索することもできます。

重複については、これを行うには多くのユーティリティがありますが、Pythonでそれを行うには、このような何かを行くだろう:

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'を使ってファイル名のリストにfileを使うことができます。リストは' -f -'で示されるstdin(pipe)から来ることができます。だから 'find ./aircon/ -name '*' 'を使うことができます。ファイル-if-' –

1

あなたはに基づいてファイルの種類を把握するためにfileプログラムを使用することができますファイル名の代わりにファイルの内容。ファイルには、BSDやOSXを含むLinuxやUNIXのすべてのバージョンが付属しています。 Windowsを使用している場合は、Cygwinに含まれていると思います。

フラグ-iでは、出力をMIMEタイプとして取得し、標準ライブラリの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

うん。私はそれをテストした後ろに改行がありませんでしたが、多分Python 2とは違うのでしょうか?いずれにせよ、 'mime.strip()'を使う方が安全です。空白文字だけを取り除きます。私はそれを含める答えを更新しています。 –

関連する問題