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 .
我正在尝试为使用 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 .