twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル 写真を整理し、重複を削除する

写真を整理し、重複を削除する

原文はこちらです。

photos-istock

デジタル カメラを使用していると、写真のアーカイブがあっと言う間に G バイトに達してしまいます。そこで、重複した写真を探し出したり、写真を整理したりする方法を学びましょう。
まずは、なにより、写真のバックアップを取ってください。
昔は、36 枚撮りのフィルム ケースをバッグに入れておいたものです。今では、フィルムの入れ替えなしに G バイトの写真を撮影できます。私のカメラに 32G バイトのカードを入れて、1 枚 18M バイトの RAW モードの写真が 1,700 枚強撮影できます。別に、みなさんに全部見せようとは考えていませんから、安心してください。自分だって全部を見たわけではありません。急いでコンピューターに写真を格納して、長い間に重複した写真ができてしまいました。また、たいした理由もないのですが、バックアップも取っていません。そこで、すべての重複した写真を処分したいと思っています。しかし、写真は 205G バイトもありました。

$ du -sh Pictures/
205G    Pictures/

いったい何枚の写真があるのでしょうか。まあ、たくさんとしか言いようがありません。find コマンドで数えてみましょう。私は、すべての写真を 1 つのディレクトリ下に格納しているので、複数ディレクトリの検索は不要でした。検索結果には、ディレクトリ数を含まないようにします。

$ find Pictures/ -type f | wc -l 
30481

たくさんありますね。重複した写真は何枚あるのでしょうか。再び、find コマンドを使います。コンピューターの性能とアーカイブの大きさによりますが、多少実行時間を要します。各ファイルの md5sum を生成し、sort コマンドでソートし、最後に uniq コマンドを使って、重複したファイルを全部表示し、各重複ファイルの間に空白行を入れます。結果には、重複ファイルのみ表示され、重複していないものは表示されません。

$ find Pictures/  -type f -exec md5sum '{}' ';' | sort | uniq --all-repeated=separate -w 15 > dupes.txt

次のような結果になります。

Pictures/unsorted-pics/Pictures/dump/IMG_4532.CR2
Pictures/Pictures-oldish/2009-4-7/2009-12-27a/IMG_4532.CR2
Pictures/unsorted-pics/Pictures/dump/IMG_4883.CR2 Pictures/2010-01-07/img_4883.cr2 Pictures/Pictures-realhome/2010/2010-01-07/img_4883.cr2 Pictures/Pictures-realhome/2011/jan-2011/img_4883.cr2

うまくできました。ある写真は 4 つ重複があることがわかりました。それでは、全体でどのくらいあるのでしょうか。Wc -l コマンドで行数を確認します。

$ wc -l dupes.txt
14156 dupes.txt

このままだと空白行も数えているため、awk コマンドを使って、ファイル名のある行のみを数えるようにします。

$ awk 'NF != 0 {++count} END {print count}' dupes.txt
9855

良くなりました。9,855 枚の写真を処理すれば良いことがわかりました。このうち、重複しているのは何枚でしょうか。ユニークなファイルを awk コマンドで数え上げます。この処理は、空白行を探し、空白行の直前の行 (ファイル名の記載された行) を数え上げます。

$ awk '/^$/{getline;print;}' dupes.txt |wc -l
4301

4,301 枚のユニークな写真と 5,554 枚の重複した写真があることがわかりました。ここで、これらの重複を移動したり、削除しても良いのですが、もっと簡便なツールがあります。

fdupes コマンドで重複ファイルを見つけて削除する

他にも、重複ファイルを見つける方法があります。fdupes コマンドです。このコマンドは、重複ファイルを見つけ、指定によって削除もします。find コマンド、md5sum コマンドと同じように動作しますが、もっと簡単に使用できます。man fdupes によって、オプションを知ることができます。fdupes コマンドは、処理の進捗状況を表示します。次の例は、Picture 内の重複を数え上げ、使用容量を表示します。

$ fdupes -rSm Pictures/
5554 duplicate files (in 4301 sets), occupying 41484.8 megabytes

awk コマンドと fdupes コマンドは、当然同じ結果を出しています。
fdupes コマンドに -d オプションを付けると重複ファイルを削除します。削除ごとにプロンプトを出しますが、-N オプションを付けるとプロンプトなしにファイルを削除します。

FSlint

FSlint コマンドはどうなんだ、と思っている読者もいるでしょう。FSlint は、この仕事に適したツールです。

fig-1 fslint


FSlint ("filesystem lint") はグラフィカルなファイルシステム クリーナーで、重複ファイルを検出、削除します。そのほかにも、無駄な空白、空っぽのディレクトリ、リンク先のないシンボリックリンク、パスワード ファイルに登録されていないユーザーが所有者となっているファイル、およびインストール済みのパッケージを表示するなどの機能を持っています。標準では、lost+found、/dev、/proc、/sys、/tmp の各ディレクトリ、git、CVS、svn、bzr の各ファイルを対象から除いて処理します。除外リストをチューニングすることもできます。
FSlint は、使いやすいツールです。処理したいディレクトリを指定して、Find をクリックして待つだけです。処理が終わると、先ほどの例にあった dupes.txt と同様にファイルリストを整理して表示します。 Select ボタンをクリックして、削除するファイルを選択します。例えば、グループの最初のファイル以外の全部のファイル、最新以外のファイル、一番古いファイル以外です。下記の例では、グループの最初のファイル以外を選択し、Delete をクリックしました。Flossmanuals.net にマニュアルがあります。
fig-2-fslint

もちろん、これらのコマンドはすべて、写真だけでなく、他のファイルについても使えます。次に、デジタル写真を扱う優れたツール、Exiftool を紹介しましょう。

ExifTool: デジタル写真のための万能ナイフ

コマンドラインで、写真のサイズ変更、名前変更、ソート、確認をする方法で、ImageMagick によるデジタル写真の扱い方を学びました。ExifTool を紹介します。ExifTool は、小粒ですが有力なツールで、これを使って、大半のイメージファイル形式のメタデータの読み書きや修正を行うことができます。基本の使い方として、EXIF データの表示があります。

$ exiftool photo.jpg
File Permissions                : rw-r--r--
File Type                       : CR2
Exif Byte Order                 : Little-endian (Intel, II)
Image Width                     : 5184
Image Height                    : 3456
Camera Model Name               : Canon EOS 7D
Exposure Time                   : 1/400
F Number                        : 6.3
ISO                             : 100
Focal Length                    : 190.0 mm
Lens Type                       : Canon EF 100-400mm f/4.5-5.6L IS

これは、簡易出力です。EXIF データを全部表示すると 324 行にもなります。では、重複問題に目を向けましょう。全写真を整理する方法です。まず、日付順に整理します。下記の例は、新規に作成した親ディレクトリの下に日付の名称を持つディレクトリ下に全写真を格納します。

$ exiftool '-Directory<CreateDate' -d newdir/%Y-%m-%d -r olddir/

私のアーカイブでは、次のようにします。

$ exiftool '-Directory<CreateDate' -d sorted-pics/%Y-%m-%d -r unsorted-pics/
    1 directories scanned
   56 directories created
   91 image files updated

結果は、次のようになります。

$ ls -1 sorted-pics/
2008-09-20
2009-04-14
2009-10-03
2010-02-18
2011-03-19

他に、年ごとに親ディレクトリを作成する方法があります。下記の例では、サブディレクトリに、年月で名前を付けます。

$ exiftool '-Directory<CreateDate' -d newdir/%Y/%Y-%m -r olddir/

万一のために、-o オプションを指定して、ファイルを移動せず、コピーすることもできます。

$ exiftool -o '-Directory<CreateDate' -d newdir/%Y/%Y-%m -r olddir/

これらの %Y %m %d %H %M %S マクロを使って、好みのフォーマットで名前を付けることができます。詳細については、man strftime を参照してください。

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ


Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!