前回のエントリの続き
前回、重複を除去したディレクトリに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
ここまで処理して気付いたが、日付が空白で入っているものがあった。
それらについては手で処理した。
以上、また機会があれば整形して公開する。