Posted by & filed under 未分類.

前回のエントリの続き

前回、重複を除去したディレクトリに8万のファイルがあった。
ここから、exif情報を元に、どのカメラで、どのサイズで、いつ撮影したか、という順で写真を無理矢理オーガナイズする。
前回同様、実施は自己責任で。あと、今回は時間の都合上、あまり整形をしていない。

2. exif情報のぶっこ抜き

debianのパッケージexifをインストールする。

# aptitude install exif

写真からexifを抜いてみる。

# exif #349650584.JPG
Corrupt data
The data provided does not follow the specification.
ExifLoader: The data supplied does not seem to contain EXIF data.

Oh. これアカンやつや。

# exif #208627408.JPG
EXIF tags in ‘#208627408.JPG’ (‘Intel’ byte order):
——————–+———————————————————-
Tag                 |Value
——————–+———————————————————-
X-Resolution        |72
Y-Resolution        |72
Resolution Unit     |Inch
Exif Version        |Exif Version 2.1
FlashPixVersion     |FlashPix Version 1.0
Color Space         |Internal error (unknown value 65535)
——————–+———————————————————-
これもあかんぽい。
# exif #183527616.JPG
EXIF tags in ‘#183527616.JPG’ (‘Intel’ byte order):
——————–+———————————————————-
Tag                 |Value
——————–+———————————————————-
Manufacturer        |FUJIFILM
Model               |FinePix F401  
Software            |Digital Camera FinePix F401   Ver1.00
Date and Time       |2004:10:07 15:22:37
YCbCr Positioning   |Co-sited
Copyright           |[None] (Photographer) – [None] (Editor)
X-Resolution        |72
Y-Resolution        |72
Resolution Unit     |Inch
Exposure Time       |1/250 sec.
F-Number            |f/2.8
Exposure Program    |Normal program
ISO Speed Ratings   |200
Exif Version        |Exif Version 2.2
Date and Time (Origi|2004:10:07 15:22:37
Date and Time (Digit|2004:10:07 15:22:37
Components Configura|Y Cb Cr –
Compressed Bits per |3.2
Shutter Speed       |8.00 EV (1/256 sec.)
Aperture            |3.00 EV (f/2.8)
Brightness          |5.23 EV (128.59 cd/m^2)
Exposure Bias       |0.00 EV
Maximum Aperture Val|3.00 EV (f/2.8)
Metering Mode       |Pattern
Light Source        |Unknown
Flash               |Flash did not fire, auto mode
Focal Length        |5.7 mm
Maker Note          |274 bytes undefined data
FlashPixVersion     |FlashPix Version 1.0
Color Space         |sRGB
Pixel X Dimension   |1500
Pixel Y Dimension   |1386
Focal Plane X-Resolu|4348
Focal Plane Y-Resolu|4348
Focal Plane Resoluti|Centimeter
Sensing Method      |One-chip color area sensor
File Source         |DSC
Scene Type          |Directly photographed
Exposure Mode       |Auto exposure
White Balance       |Auto white balance
Scene Capture Type  |Standard
Sharpness           |Normal
Subject Distance Ran|Unknown
——————–+———————————————————-
やっとまともそうなのがでてきた。
ということで、今回3パターンあるということがわかった。
  • ちゃんと復元できた
  • 完全にぶっこわれている
  • あやしい
上記を踏まえパスの構造は以下のような感じにする。

[status]/[source]/[pixelsize]/[date]/[timestamp]_[name].jpg
nameは元の数字スタイルのファイル名。
他は推測ください。
ちなみに、上記の1500×1386というのが正にそうだったのだが、ピクセルサイズの計算方法が違うためか実際に開いてみると1500×1050というサイズだった。どこかで対応できるかググってみたがあまり良い情報が出ず、断念してそのままEXIF情報を鵜呑みにすることにした。

3. 実装

awk(今回はnawk) と exif の合せ技で適当に作る。。。と思ったが、まず冒頭に#が入っていると色々扱いにくいので、取り外す。
$ find ./ | xargs rename ‘s/#//’
スクリプトの実装
めっちゃ長くなった…
#!/bin/sh
FILE=$1
exif $FILE |
awk -v SRCN=${FILE} ‘
BEGIN {
 FS=”|”;
 STAT=0;
 SRC=”null”;
 PX=”nan”;
 PY=”nan”;
 DATE=”00unknow”;
 TS=”00unkn”;
}
/^Model/ {
 STAT++;
 SRC=$2;
 gsub(/^ +| +$/, “”, SRC);
 gsub(/[^-a-zA-Z0-9_+=.]/, “_”, SRC);
}
/^Pixel X Dimension/ {
 STAT++;
 PX=$2;
 gsub(/ /, “”, PX);
}
/^Pixel Y Dimension/ {
 STAT++;
 PY=$2;
 gsub(/ /, “”, PY);
}
/^Date and Time/ {
 if (DATE==”00unknow”) {
   STAT++;
   DATE=substr($2, 1, 10);
   gsub(/:/, “”, DATE);
   STAT++;
   TS=substr($2, 12, 8);
   gsub(/:/, “”, TS);
 }
}
END {
 if (STAT>=5) {
   STAT=”good”
 } else if (STAT) {
   STAT=”bad”
 } else {
   STAT=”corrupt”
 }
 DSTN=SRCN;
 gsub(/^.*/|.[^.]*$/, “”, DSTN);
 printf(“%s %s/%s/%sx%s/%s/%s_%s.jpgn”, SRCN, STAT, SRC, PX, PY, DATE, TS, DSTN);
}
上記をorganizer.shとして保存、実行。
$ find ./jpg/ -type f | head -5 | xargs -l1 sh organize.sh 
./jpg/147391416.JPG good/FinePix_S5000/2048×1536/20060919/154827_147391416.jpg
./jpg/685164448.JPG bad/null/nanxnan/20110922/160607_685164448.jpg
Corrupt data
The data provided does not follow the specification.
ExifLoader: The data supplied does not seem to contain EXIF data.
./jpg/71972166.JPG corrupt/null/nanxnan/00unknow/00unkn_71972166.jpg
Corrupt data
The data provided does not follow the specification.
ExifLoader: The data supplied does not seem to contain EXIF data.
./jpg/165420104.JPG corrupt/null/nanxnan/00unknow/00unkn_165420104.jpg
./jpg/145980200.JPG good/FinePix_S5000/2816×2112/20050816/131321_145980200.jpg
あとは、これを使って適当にファイルをコピーする
$ find ./jpg/ -type f | xargs -l1 sh organize.sh > organized.txt 2> /dev/null
$ grep corrupt organized.txt | wc -l
26079
$ grep bad organized.txt | wc -l
2818
$ grep good organized.txt | wc -l
53355
$ cut -d’ ‘ -f2 organized.txt | sed -e ‘s//[^/]*$//’ | sort | uniq | xargs mkdir -p
$ sed -e ‘s/^/mv /’ organized.txt | sh
ここまで処理して気付いたが、日付が空白で入っているものがあった。
それらについては手で処理した。
以上、また機会があれば整形して公開する。

Trackbacks/Pingbacks

  1.  テスト | haruo31's blog
  2.  finaldataで画像を復旧したときのメモ(part1) | haruo31's blog

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です