画像ファイルの名前を年齢別に一括変更し、ファイル名に日付と変数を追加します。

画像ファイルの名前を年齢別に一括変更し、ファイル名に日付と変数を追加します。

この質問は、最初に質問したときに知らなかった最初の2つの回答とコメントで学ぶことによって完全に書き直されました。


写真を撮った後、そのような書類を持って家に帰りました_DSC1234.NEFNEFNikonのCamera Rawファイル形式なので、EXIFデータがファイルに存在します。

3つの部分に自動的に名前を変更したいと思います。

  1. 作成日の形式YYYYMMDD
  2. 撮影名
  3. 写真数

したがって、最終ファイル名は次のようにする必要があります

20140707_NameOfShoot_0001.NEF

いくつかの質問があります:

広告1.作成日 場合によっては、ファイルを撮影してから数日後にのみファイルをコピーして名前を変更できるため、日付はコピーした日付ではなく写真を撮った日付を反映する必要があります。mtime最良の選択のようですが、可能であれば作成日を教えてくださいEXIF

広告2:撮影名 理想的には、スクリプトを呼び出すときにパラメータとして設定できる変数です。

広告3.写真の枚数 これは画像の年齢を反映する必要があり、最も古いものから番号が付けられています。問題は、カメラが通常0000ヒット後に番号付けを再開することです9999。それでは9995-9999おそらくそれよりも古いでしょう0000-0004。ファイルの寿命を反映するソリューションを探しています。この特別なケースでは、名前を変更する

  • _DSC0000.NEF -> 20140707_FOO_0004.N​​EF
  • _DSC0001.NEF -> 20140707_FOO_0005.NEF
  • _DSC0002.NEF -> 20140707_FOO_0006.NEF
  • ...
  • _DSC9997.NEF -> 20140707_FOO_0001.NEF
  • _DSC9998.NEF -> 20140707_FOO_0002.NEF
  • _DSC9999.NEF -> 20140707_FOO_0003.NEF

もう一度申し上げますが、mtime可能であれば作成日がEXIF正しいようです。


~からここ日付別にフォルダ内のすべての.NEFファイルの名前を変更する作業ソリューションがあります。

find -name '*.NEF' | 
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.NEF\n", $0, a++ }' | 
bash 

ファイルの変更日とショット名をハードコーディングするのはうまくいきますが、自動化できれば良いでしょう。

タイムスタンプの場合の記事を見つけstrftime()ましたが、それを使用してファイルの変更日を返す方法を理解していません。また、gawk-lineに追加および追加しようとしましたが、これにより現在のフォルダ内のすべてのファイルが削除されます(時間を変更するのではなく、おそらくsystimeも削除されます)。mktime()systime()DATE=$(date +"%Y%m%d")$DATE

私が試した変数について

gawk 'BEGIN{ a=1 }{ printf "mv %s $1_%04d.NEF\n", $0, a++ }' | 

呼び出しスクリプトを使用します./rename FOOが、名前を変更するとFOOは無視されます。

ベストアンサー1

ほとんどのUnixはファイル作成日を追跡しません。とにかく、「作成日」は明確に定義されていません。 (ファイルをコピーすると新しいファイルが作成されますか?)合理的な解釈によれば、最新バージョンのデータが作成された日付であるファイル修正時間を使用できます。ファイルをコピーする場合は、変更時間を保存する必要があります(たとえば、そのコマンドを使用しているcp -p場合はbareを使用しないでください)。cp -acpcp

一部のファイル形式には、作成者アプリケーションが作成日を入力するファイル内のフィールドがあります。これは写真の場合であり、カメラはいくつかのコンテンツを埋めます。Exf生成時間を含むJPEGまたはTIFF画像のデータ。 NikonのNEF画像フォーマットはTIFFをラップし、Exifをサポートします。

ファイル名に作成日を含めるためにExifデータを含む画像ファイルの名前を変更するために使用できるツールがあります。名前に作成日を含めるように画像の名前を変更する2つの解決策が表示されます。エクスポートツールそしてexiv2

どちらのツールも、ファイル名にカウンタを含めることを許可しないと思います。 2つのステップに名前を変更できます。まず、ファイル名に日付を含め(順序を維持するために可能な高解像度で)、その日付部分に基づいてファイル番号を付けます(時間は削除します)。最新のデジタル一眼レフは連続的に画像を撮影できるので(NikonのD4は11fpsで撮影する)、最初のステップで元のファイル名を維持することをお勧めします。そうしないと、同じファイル名を持つ複数のファイルが発生する可能性があります。

exiv2 mv -r %Y%m%d-%H%M%S:basename: *.NEF
# exiv2 uses `strftime(3)`, so `%Y%m%d-%H%M%S` returns YYYYMMDD-hhmmss
# :basename: is a naming variable exiv2's `-r`-handle provides. See `exiv2 -h` for more  
# Now you have files with names like 20140630-235958_DSCC1234.NEF.
# Note that chronological order and lexicographic order agree with this naming format.
i=10000
for x in *.NEF; do
  i=$((i+1))
  mv "$x" "${x%-*}_FOO_${i#1}.NEF"
done

${x%-*}文字の後ろの部分を削除します-。カウンタ変数は、i10000から計算を開始し、1先行番号を削除することによって使用されます。これは、すべてのカウンタ値が同じ数値を持つように先行ゼロを取得するトリックです。

ファイル名の数を増やしてファイル名を変更するカウンタを含むように複数のファイルの名前を変更する別のソリューションがあります。

Exifデータの代わりにファイルのタイムスタンプを使用するには、次を参照してください。ファイル名の末尾に変更された日付タイムスタンプを使用して複数のファイルの名前を変更しますか?


通常、シェルコードを生成してからシェルにパイプしないでください。これは不必要に複雑です。たとえば、代わりに

find -name '*.NEF' | 
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.NEF\n", $0, a++ }' | 
bash

書くことができます

find -name '*.NEF' | 
gawk 'BEGIN{ a=1 }{ system(sprintf("mv %s %04d.NEF\n", $0, a++)) }'

'ファイル名がシェルコードとして解釈されるため、ファイル名にシェル特殊文字(スペース、、、など)が含まれていると、両方のバージョンが悲惨な結果になる可能性があります。これを強力なコードに置き換える方法がありますが、最も簡単な方法ではないので、そのアプローチを使用しないでください。$`


1 「ctime」というものがありますが、c動作しません。作る、これは変化。 ctimeは、ファイルの内容やメタデータ(名前、権限など)が変更されるたびに変更されます。 ctime は生成時間とほぼ反対です。

おすすめ記事