为具有唯一文件名的图片递归创建符号链接,尽管时间戳是不够的

为具有唯一文件名的图片递归创建符号链接,尽管时间戳是不够的

.CR2我的相机(或)的照片.JPG具有正确的 exif 日期 + 时间,但仅以秒为单位,不幸的是不是以毫秒为单位。因此,有些照片具有相同的 date_time 值(在同一秒拍摄)。照片保存在子文件夹中,这就是为什么 exiv2 无法仅通过 date_time 创建唯一的文件名(超出所有文件夹)。初始情况示例:

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

问题中的问题是“var”在由“-execdir”启动的子shell中递增,因此父shell无法获取更改后的值。在这种情况下,您无法使用 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

相关内容