web-dev-qa-db-ja.com

写真を既存のフォルダー構造から新しい構造に再編成する

私は以前に(再)編成されたフォトイのディレクトリをディレクトリ構造に持っています:Year/Month/Day

それが私にとって便利なグループ化ではないという事実は別として、そこには誤りがあります。例えば; 2007年の私のフォルダには2010年の写真があります。

写真を整理するためのいくつかのプログラム(Shotwellなど)があることは知っていますが、それらは私が持っている大量の写真に苦労しており、すべて既存のファイル構造を維持しているようです。

私がやりたいのは、すべての画像をフォルダから取り出し、構造Year/Monthに従って正しく再編成することです。そうすれば、閲覧しやすくなり、アルバムにまとめることができます。

これを行うばかげた方法がありますか?また、これに関する有用なフォーラムディスカッションへのリンクは非常に役立ちます。

1
Zebla

写真を/ year/monthディレクトリに再編成するスクリプト

以下のスクリプトは次のことを行います:

  • 写真が撮られた月を決定します
  • ターゲットディレクトリ内に、(必要に応じて)(写真が見つかった場合)ごとにサブディレクトリを作成します
  • これらのyearディレクトリ内では、-monthごとにサブディレクトリを作成します
  • スクリプトが適切な日付を見つけることができない場合、「未定」という名前のフォルダーを作成します

年間フォルダ数

enter image description here

1か月あたりのサブフォルダ

enter image description here

重複の処理:

  • 重要なことは、複製を適切に処理することです。デジタルカメラは、似た名前のシリーズ(IMG_1.jpegIMG_2.jpegなど)のショットを撮ります。したがって、重複するものは自動的に名前を変更する必要があります。そうしないと、スクリプトが壊れるか、多数の写真が失われます。
    スクリプトは次のように重複の名前を変更します:

    IMG_1.jpeg, duplicate_1_IMG_1.jpeg, duplicate_2_IMG_1.jpeg etc
    

使い方

  1. スクリプトはexifを使用してメタデータを読み取ります。

    Sudo apt-get install exif
    
  2. 以下のスクリプトを空のファイルにコピーします。

  3. スクリプトのヘッドセクションで、ディレクトリを定義します写真のコピー先(ターゲットディレクトリ):

    #---
    save_to = "/targeted/directory"
    #---
    
  4. スクリプトをreorganize.pyとして保存します。

  5. 必要に応じてターゲット(上位)ディレクトリを作成します
  6. 次のコマンドを使用して、ソースディレクトリ(写真が保存されているフォルダー)を引数としてスクリプトを実行します。

    python3 /path/to/reorganize.py <source_directory>
    

    targetディレクトリをスクリプトに設定しました。他のドキュトリー(新しい画像)を同じディレクトリに自動的に整理して追加したい場合があるためですsourceディレクトリは将来の状況では異なります。

重要な注意事項

  • Dat形式は、カメラごとに若干異なる場合があります。スクリプトでは、次の形式を考慮しました。

    Datum en tijd       |2013:08:18 15:58:46
    

    そして

    Datum en tijd       |2013-08-18 20:21:32
    

    他のカメラでは異なる場合があります。スクリプトが正しく機能しない場合は、コマンドexif <image>の出力を送信する必要がありますが、ほとんどの場合、正常に機能します。

  • そのままのスクリプトcopies新しい(サブ)ディレクトリへの写真。すべてがうまくいくことを確認するまで、元のディレクトリをいじりたくないので、 移動ファイルにしたい場合は、次の行を置き換えます。

    shutil.copyfile(file, newfile)
    

    沿って:

    shutil.move(file, newfile)
    

スクリプト

#!/usr/bin/env python3
import subprocess
import os
import sys
import shutil

#---
save_to = "/targeted/directory"
#---

directory = sys.argv[1]
if not os.path.exists(save_to):
    os.mkdir(save_to)

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")

def check_dir(dr):
    if not os.path.exists(dr):
        os.mkdir(dr)

def rename_dups(target_dir, name):
    n = 1; name_orig = name
    while os.path.exists(target_dir+"/"+name):
        name = "duplicate_"+str(n)+"_"+name_orig
        n = n+1
    return target_dir+"/"+name

for root, dirs, files in os.walk(directory):
    for name in files:
        file = root+"/"+name
        try:
            date = [l for l in get("exif "+'"'+file+'"').splitlines()\
                    if "Dat" in l][0].split("|")[1].split()[0]
            if "-" in date:
                date = date.split("-")[:2]
            Elif ":" in date:
                date = date.split(":")[:2]
            targeted_dir = save_to+"/"+date[0]
            check_dir(targeted_dir)
            sub_dir = targeted_dir+"/"+date[1]
        except:
            sub_dir = save_to+"/"+"undetermined"
        check_dir(sub_dir)
        newfile = rename_dups(sub_dir, name)
        shutil.copyfile(file, newfile)
2
Jacob Vlijm

Pythonユーティリティでそれを行う

@ andrewning がこの目的のために作成したツールにより、これと、発生したEdgeケースを処理できます

1.インストール

インストールはpip install sortphotosを実行するのと同じくらい簡単です

2.使用法

インストールすると、sortphotosによって呼び出されるコマンドとして存在します。質問の中で必要なものに従って写真を並べ替えるには、次のように実行します

sortphotos -r ./source ./destination --sort %Y/%m-%b

ここで、--sortによって与えられるフォーマット文字列は、sourceディレクトリ内の写真がdestinationディレクトリに整理される構造を決定します。ここでは、以下に示すようにファイルをソートします。

フォーマット文字列は、サブディレクトリを区切る/(スラッシュ)を使用して strftime仕様 で使用されるように指定できます。

3.その他の注意事項

名前の衝突(つまり、同じ月に同じ名前を持つ2つの写真)には、自動的に番号が追加されます。ファイルの動きをシミュレートして、すべてが正しいかどうかを確認したい場合は、次のように-tフラグを使用します。

sortphotos -tr ./source ./destination --sort %Y/%m-%b

有効なEXIFデータを持たないファイルは、デフォルトではUnknownというタイトルのサブフォルダーに保存されますが、オプション--unknown-dirで変更できます

0
Amith KK

http://owl.phy.queensu.ca/~phil/exiftool/
パッケージをダウンロードします。
「インストール手順」を検索( http://owl.phy.queensu.ca/~phil/exiftool/install.html

上記の「exiftool」を使用した未テストのbashスクリプト。

 $ cat exifto 
#!/ bin/bash 
 
 exiftool -r\
-d $ HOME/Pictures/Original_Images /%Y/%m /%d/%% f。%% e\
 "-filename <filemodifydate"\
 /media/MEMORY_CARD/DCIM/
$

Exiftoolはこれ以上のことができます。

0
Hannu