EXIF情報で画像を日付順に並べ替えて名前を変更する


9

写真フォルダに混乱があります。EXIF情報で日付順に並べ替え、日付に応じて名前を変更したい(001.jpg、002.jpgなど)。

Linuxでこれを行うにはどうすればよいですか?以前にいくつかの基本的な一括処理タスク(変換やサイズ変更など)にImageMagickを使用しましたが、このタスクに使用できますか?

回答:


21

Linuxでは、コマンドexiftoolを使用できます。なんらかの理由で、オンラインマニュアルに「RENAMING Examples」セクションが含まれておらず、重要なヒントが得られました。

JPGのみのファイルの場合、次のコマンド呼び出しでジョブを実行できます。

exiftool -r '-FileName<CreateDate' -d '%Y-%m-%d/%H_%M_%S%%-c.%%le' <yourFolder>

説明:

  • -r 再帰用です
  • '-FileName<CreateDate'exiftoolに、EXIFタグに従ってファイルの名前を変更するように指示しますCreateDateModifyDateただし、他の方法で試すこともできます)。
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'日付ソース「CreateDate」からファイル名文字列を構築する方法を指示します(「%-c」はファイルの衝突の場合にカウンターを追加します。「%le」は「小文字のファイル拡張子」を表します)。
    • -FileName<...ここでは、「」を使用して、ファイルの名前を変更し、1つのステップで別のフォルダに移動しました。マニュアルでは-Directory<...、フォルダ操作には " "構文を使用する必要があることを指摘しています。これは私にとってもこのように機能しました。

この強力なツールのマニュアルを読むのに少し時間をかける必要があります。多分もっと短い方法があります:D


1
ドキュメントの名前変更の例:sno.phy.queensu.ca/~phil/exiftool/…
rwoo


2

最も簡単な方法は、ファイルをjbroutにインポートするだけです...その後、(オプションで)すべてのファイルの名前を時間指定の名前に変更できます。または、名前を変更する必要がないこともわかります(jbroutで十分です)。


1

私は小さくてあまり最適化されていないpythonスクリプトを実行しました。

1 import pyexiv2, sys, os, time, datetime, random
2 dirname = sys.argv[1]
3 flist=os.listdir(dirname)
4 dic = dict()
5 for fname in flist:
6     metadata = pyexiv2.ImageMetadata(sys.argv[1]+'/'+fname)
7     metadata.read()
8     tag = metadata['Exif.Image.DateTime']
9     timestamp = int(time.mktime(tag.value.timetuple()))
10     #print fname, ' ', tag.value, ' ', timestamp
11     try:
12         dic[timestamp] = fname
13     except:
14         print fname, ' not processed.'
15 
16 keys = dic.keys()
17 keys.sort()
18 i = 0 
19 for k in keys:
20     os.rename(sys.argv[1]+'/'+dic[k], sys.argv[1]+'/'+str(i)+'.jpg')
21     i+=1

このライブラリtilloy.net/dev/pyexiv2
celebdor

1

Debian Lennyで機能させるには、次のことを試してください。

import pyexiv2, sys, os, time, datetime, random
dirname = sys.argv[1]
flist=os.listdir(dirname)
dic = dict()
for fname in flist:
    image = pyexiv2.Image(sys.argv[1]+'/'+fname) 
    #metadata = pyexiv2.ImageMetadata(sys.argv[1]+'/'+fname)
    #metadata.read()
    image.readMetadata() 
    tag = image['Exif.Image.DateTime']
    timestamp = int(time.mktime(tag.timetuple()))
    #print fname, ' ', tag.value, ' ', timestamp
    try:
    dic[timestamp] = fname
    except:
    print fname, ' not processed.'

keys = dic.keys()
keys.sort()
i = 0 
for k in keys:
    os.rename(sys.argv[1]+'/'+dic[k], sys.argv[1]+'/'+str(i)+'.jpg')
    i+=1

1

phpで私はこのようなことをしました:

<?php

$path = "./path/to/images";
$files = scandir($path);

foreach ( $files as $file )
{
    if ( $file[0] === "." )
    {
        continue;
    }
    $ext = end(explode(".", $file));

    $suffix = "image";

    $exif = exif_read_data($path."/".$file, 'EXIF');
    $datetime = str_replace("/","-", $exif['DateTimeDigitized']);

    rename($path."/".$file, $path."/".$datetime.$suffix.".".$ext);
}

0

私たちはそれであるが、ここでは、より多くの「ハメ撮りプログラミング」スタイルをものであるbash使用して、exiftoolそれはいくつかのディレクトリおよび/または一回の個々のファイルに放たすることができます。認識されないMIMEタイプのファイルはスキップされます。

これは、使用して写真の名前を変更しDateTimeOriginalた結果ではないので(EXIFタグを001.jpgけど2015-12-22_14:43:15.jpg

名前の競合がある場合は、インデックス番号が適用されます2015-12-22_14:50:57.1.jpg

役に立つかもしれません:relabel_photo_with_datetimeoriginal.sh

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.