読者です 読者をやめる 読者になる 読者になる

(O+P)ut

習うより慣れろ、Practice makes perfect。この言葉をモットーに、Slerで働く若手インフラエンジニアが、学んだ知識を【 (O+P)ut = OutPut 】していく場です。

【Mac】mdfindでiPhoneのスクショを見つけ出す

以前,Spotlightを使ってみるで,Macではmdlsやmdfindを使ってファイルの詳細な情報を使って検索をかけたりできることを自分で確認したのですが,今回はせっかくなのでそれを使ったプログラムを作ってみた*1

作ったプログラムは,iPhoneで撮った写真をPCに保存している時にスクリーンショットのみを一気に消す処理を行うものです.なんかiPhoneアプリスクリーンショットのみを消せるアプリはあるみたいなんですけど,実際にパソコン側にデータを持ってきた後ではいちいち手作業で消していくことになると思うので.

今回はシェルスクリプトで書きました.最初はjavaで書いてたんですけど,外部プログラムを実行する

Runtime.getRuntime().exec(hoge)

hogeにダブルクォーテーションを入れるとなんか思った通りに動かなかったんですよね.
今回,スクリーンショットか否かを判断するのに
kMDItemPixelHeightとkMDItemPixelWidthを使いました.スクリーンショットの画像は全てこれが一緒だったので,ここで絞ればいいかな〜という安易な発想です.もっと明示的にこいつはスクリーンショットだ!ってのがあればそっちを使いたいので見つかればそっちに切り替えるかも.

作ったプログラムの全文は以下です.

#!/bin/sh
ARRAY=(`mdfind -onlyin ./ "kMDItemPixelHeight = '$1' && kMDItemPixelWidth = '$2$"`)

mkdir SS_`date +%Y-%m-%d`
i=0
for var in ${ARRAY[@]}
do
fext="${var##*/}"
#echo $var
mv $var ./SS_`date +%Y-%m-%d`/$fext
i=$((i+1))
done

echo $i pictures moved

簡単に動作を説明しますと,引数($1,$2)にPixelHeightとPixelWidthを入れます.これはスクリーンショット画像をmdlsで見ると分かります.もちろんFinderで画像の情報を見ても「大きさ 640x1136 」といった感じで出てきます.この情報を元にmdfindで検索をかけます.このプログラムではパスが ./ となっていることからも分かる通り,画像ファイルがあるところにこのコードを置く必要があるので注意です.
次にいきなりスクリーンショットを全部消すと間違えて消しちゃった場合にまずいのでスクリーンショットと判断した画像を移すためのディレクトリを作成しています.そしてそこにどんどん移していって最後に何枚移動させたかを表示して,おしまいです('ω')/~ スクリーンショットを消すっていいましたけど,結局はそこのフォルダに確認しにいって,もし大事な写真が混じっていたらそれはコピーしてもとのところに戻せるようにしています(笑)もし消していいならFinderからディレクトリ毎消すなり rm -r で消すなりすればOKです.

実際に自分の環境でやってみました.

hoge$ ./SS_delete.sh 1136 640
64 pictures moved

となりSS_2015-06-09というフォルダができていて,64枚の画像が移動していました.
結果なんですが,一応移動した画像は全てスクリーンショットで,高さと横を逆にした ./SS_delete.sh 640 1136 でも何枚かヒットしました.この検索方法は,スクリーンショット以外の画像が入ってきそうでまだまだ改善の余地はあるとは思いますが,とりあえずはうまいこといったので良かったです.

*1:もしかしたら車輪の再発明かも...まぁ勉強になったからいいけど