私は以前に(再)編成されたフォトイのディレクトリをディレクトリ構造に持っています:Year/Month/Day。
それが私にとって便利なグループ化ではないという事実は別として、そこには誤りがあります。例えば; 2007年の私のフォルダには2010年の写真があります。
写真を整理するためのいくつかのプログラム(Shotwellなど)があることは知っていますが、それらは私が持っている大量の写真に苦労しており、すべて既存のファイル構造を維持しているようです。
私がやりたいのは、すべての画像をフォルダから取り出し、構造Year/Monthに従って正しく再編成することです。そうすれば、閲覧しやすくなり、アルバムにまとめることができます。
これを行うばかげた方法がありますか?また、これに関する有用なフォーラムディスカッションへのリンクは非常に役立ちます。
以下のスクリプトは次のことを行います:
年間フォルダ数
1か月あたりのサブフォルダ
重複の処理:
重要なことは、複製を適切に処理することです。デジタルカメラは、似た名前のシリーズ(IMG_1.jpeg
、IMG_2.jpeg
など)のショットを撮ります。したがって、重複するものは自動的に名前を変更する必要があります。そうしないと、スクリプトが壊れるか、多数の写真が失われます。
スクリプトは次のように重複の名前を変更します:
IMG_1.jpeg, duplicate_1_IMG_1.jpeg, duplicate_2_IMG_1.jpeg etc
スクリプトはexif
を使用してメタデータを読み取ります。
Sudo apt-get install exif
以下のスクリプトを空のファイルにコピーします。
スクリプトのヘッドセクションで、ディレクトリを定義します写真のコピー先(ターゲットディレクトリ):
#---
save_to = "/targeted/directory"
#---
スクリプトをreorganize.py
として保存します。
次のコマンドを使用して、ソースディレクトリ(写真が保存されているフォルダー)を引数としてスクリプトを実行します。
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)
@ andrewning がこの目的のために作成したツールにより、これと、発生したEdgeケースを処理できます
インストールはpip install sortphotos
を実行するのと同じくらい簡単です
インストールすると、sortphotos
によって呼び出されるコマンドとして存在します。質問の中で必要なものに従って写真を並べ替えるには、次のように実行します
sortphotos -r ./source ./destination --sort %Y/%m-%b
ここで、--sort
によって与えられるフォーマット文字列は、source
ディレクトリ内の写真がdestination
ディレクトリに整理される構造を決定します。ここでは、以下に示すようにファイルをソートします。
フォーマット文字列は、サブディレクトリを区切る/
(スラッシュ)を使用して strftime
仕様 で使用されるように指定できます。
名前の衝突(つまり、同じ月に同じ名前を持つ2つの写真)には、自動的に番号が追加されます。ファイルの動きをシミュレートして、すべてが正しいかどうかを確認したい場合は、次のように-t
フラグを使用します。
sortphotos -tr ./source ./destination --sort %Y/%m-%b
有効なEXIFデータを持たないファイルは、デフォルトではUnknown
というタイトルのサブフォルダーに保存されますが、オプション--unknown-dir
で変更できます
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はこれ以上のことができます。