web-dev-qa-db-ja.com

コンテンツで画像ファイルを見つける方法

私はファイルのリストを持っています、そして私はすべての画像ファイルを見つけるそのリストからする必要があります。

たとえば、私のリストに次のものが含まれている場合:

Pidgin.tar.gz
photo01.jpg
picture01
screenshot.gif
invoice.pdf

次に、以下を選択するだけです。

photo01.jpg
picture01
screenshot.gif

ノート:

  • メソッドはファイル拡張子に依存してはなりません
  • PhotoshopとGimpのあいまいな画像形式は無視できます。 (fehで表示できない場合は、画像ではありません)
6
Stefan

次のコマンドは、画像ファイルの名前を含むlist_fileの行を一覧表示します。

<list_file xargs -d \\n file -i | sed -n 's!: *image/[^ :]*$!!p'
  • file -i FOOは、FOOの最初の数バイトを調べてその形式を判別し、FOO: image/jpegのような行を出力します(-iはMIMEタイプを表示することを意味します。これはGNUファイル)。
  • xargs -d \\nは、標準入力からファイルのリスト(1行に1つ)を読み取り、後続のコマンドをそれに適用します。 (これには、Linuxで見られるGNU xargsが必要です。他のシステムでは、-d \\nを省略しますが、ファイルリストに\'"または空白を含めることはできません)。
  • sedコマンドは、ファイル名だけを表示するように: image/FOOサフィックスを除外します。画像ファイルに対応していない行は無視されます。
file -ib image | awk '"^image/" {print}'

ファイルが画像を検出した場合、次のような行を印刷する必要があります。

image/jpeg; charset=binary

マジックナンバーで動作するため、拡張に基づいていません。それ

2

fileコマンドに加えて、ImageMagickを使用することもできます。以下に、現在のディレクトリ内のすべてのファイルのタイプを示します。

find -type f -depth 0 -print0 | xargs -0 identify

identifyコマンドは、さまざまなファイルタイプに対して次のようなものを出力します。

text.txt[8] TXT 612x792 612x792+0+0 16-bit DirectClass 694B 0.320u 0:00.330
php.jpg[31] JPEG 1280x1024 1280x1024+0+0 8-bit DirectClass 195KB 0.000u 0:00.000

アニメーションGIFファイルはより多くの情報を印刷します(これは21フレームのGIFです):

adhd.gif[0] GIF 211x200 211x200+0+0 8-bit PseudoClass 256c 233KB 0.000u 0:00.029
adhd.gif[1] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029
adhd.gif[2] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029
...
adhd.gif[18] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000
adhd.gif[19] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000
adhd.gif[20] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000

次に、awkまたは同様のツールを使用して、それらをどうするかを決定できます。

1
greyfade

Python and python-magic の場合。例:

#!/usr/bin/env python
import magic
import os
path=sys.argv[1]
mime = magic.open(magic.MAGIC_NONE)
mime.load()
for r,d,f in os.walk(path):
    for files in f:
        filename=os.path.join(r,files)
        filetype=mime.file(filename)
        if "image" in filetype:
            print "File: %s is %s" %(filename, filetype)
1
user1606

おそらく私が見逃しているものがありますが、これは私にとってはうまくいくようです:

file -i * | grep "image/" | cut -d: -f1
0
mdwstmusik