.CR2
私のカメラの写真には.JPG
正確なEXIF日付+時間がありますが、残念ながらミリ秒ではなく秒単位です。したがって、一部の写真のdate_time値は同じです(同じ秒で撮影されます)。写真はサブフォルダーに保存されるため、exiv2は日付_時刻のみですべてのフォルダーに一意のファイル名を作成することはできません。初期状況例:
Folder 1 / 2016_12_01_1326.JPG
Folder 1 / 2016_12_02_1830.CR2
Folder 2 / 2016_12_01_1326.JPG (same date, hours, and seconds but not milliseconds)
私のすべての写真に一意の名前を持つシンボリックリンクを作成したいと思います。この問題を解決するための私のアイデアは、exiv4を介して写真のファイル名を日付/時刻に変換し、同じ名前と連続番号が付けられたシンボリックリンクを使用することでした。
したがって、最終シンボリックリンクの結果は次のようになります。
2016_12_01_1326_0001.JPG
2016_12_01_1326_0002.JPG
2016_12_02_1830_0003.CR2
私の方法は次のとおりですが、進行中の数字では機能しません。
f=$(pwd);
export f;
var=0; export var;
find 2016/. \( -name "*.CR2" -o -name "*.JPG" \) -execdir sh -c 'ln -s "$PWD"/$(basename {}) "$f"/2016_Links/Pictures/Link_"$((var++))"_$(basename {})' {} \;
$((var++))
次のエラーのため動作しません。
./20160312_09_02_42.CR2: 1: ./20160312_09_02_42.CR2: arithmetic expression: expecting primary: "var++"
答え1
問題は、「-execdir」で始まるサブシェルで「var」が増加するため、親シェルが変更された値を取得できないことです。この場合、findは進行状況を追跡しないため、findを使用してすべての操作を実行することはできません。
以下は、目的のリンク名とfindコマンドでほとんど使用されたリンク名を含むソリューションです。目的のリンク名を試してください。
export var=0
for F in $(find 2016 \( -name "*.CR2" -o -name "*.JPG" \)); do
FL=${F##*/}
echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/${FL%.*}_$(printf "%04d" $((var++))).${FL##*.}"
# or
echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/Link_$((var++))_${F##*/}"
done
編集する:名前にスペースが含まれている場合は、最初に引用符が必要になり、他のループを少し変更すると問題が解決します。
export var=0
find 2016 \( -name "*.CR2" -o -name "*.JPG" \) | while read F; do
FL=${F##*/}
echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/${FL%.*}_$(printf "%04d" $((var++))).${FL##*.}"
# or
echo ln -s "$PWD/${F}" "$PWD/2016_Links/Pictures/Link_$((var++))_${F##*/}"
done