Bash 递归到包含空格的子文件夹

Bash with recursion into subfolders containing spaces

我正在尝试为使用 DSLR 拍摄的照片添加唯一 ID。 DSLR 同时保存 RAW 文件 (NEF) 和实际图像文件 (JPG)。这些对代表相同的图像,因此应该具有相同的图像 ID。

我尝试了下面的 bash 脚本,它可以正常工作。但是,由于我的文件夹名称中有空格,我必须 运行 来自每个子文件夹的脚本,而不是来自父图片文件夹的脚本。

如何重做脚本,以便允许名称包含空格的子文件夹?

#!/bin/bash

LIB="."

for file in $(find $LIB -name '*.NEF'); do
        UUID=`uuidgen`
        exiftool -q -if 'not $ImageUniqueID' "$file" -ImageUniqueID=$UUID -overwrite_original;
        exiftool -q -if 'not $ImageUniqueID' "${file%.NEF}.JPG" -ImageUniqueID=$UUID -overwrite_original;
done

使用循环find,不能同时使用。

# With a loop
shopt -s globstar
for f in "$LIB"/**/*.NEF; do
  uuid=$(uuidgen)
  exiftool -q -if 'not $ImageUniqueID' "$file" -ImageUniqueID=$uuid -overwrite_original
  exiftool -q -if 'not $ImageUniqueID' "${file%.NEF}.JPG" -ImageUniqueID=$uuid -overwrite_original
done

# With find
find "$LIB" -name "*.NEF" -exec sh -c '
     uuid=$(uuidgen)
     exiftool -q -if "not $ImageUniqueID" "" -ImageUniqueID=$uuid -overwrite_original;
     exiftool -q -if "not $ImageUniqueID" "${1%.NEF}.JPG" -ImageUniqueID=$uuid -overwrite_original
     ' _ {} \;

exiftool 的启动时间是其最大的性能损失,运行对每个文件执行一次会显着增加 运行 时间,尤其是在处理数百个(如果不是数千个)文件时。

除非你特别需要 uuidgen 生成的 id 类型,否则 exiftool 必须能够使用 NewGUID 标签创建一个唯一的 id。如 Extra Tags page 中所列,它由 "a new, random GUID with format YYYYmmdd-HHMM-SSNN-PPPP-RRRRRRRRRRRR, where Y=year, m=month, d=day, H=hour, M=minute, S=second, N=file sequence number in hex, P=process ID in hex, and R=random hex number" 组成。可以将主题标签添加到标签名称的末尾(例如 NewGUID#)以取消破折号。

然后你可以运行
exiftool -overwrite_original -ext Nef -r -q -if 'not $ImageUniqueID' '-ImageUniqueID<NewGUID' .
递归地写入所有 nef 文件(由 -r 选项启用)然后 运行 第二个命令将 ImageUniqueID 从 nefs 复制到带有
的 jpgs exiftool -overwrite_original -ext jpg -r -q -TagsFromFile %d%f.nef -ImageUniqueID .