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

递归到包含空格的子文件夹中的Bash,bash,find,exiftool,Bash,Find,Exiftool,我正在尝试为我的数码单反相机拍摄的照片添加唯一的ID。DSLR同时保存原始文件(NEF)和实际图像文件(JPG)。这些对表示相同的图像,因此应该具有相同的图像ID 我尝试了下面的bash脚本,它可以正常工作。但是,由于我的文件夹名称中有空格,我必须从每个子文件夹而不是从父图片文件夹运行脚本 如何重做脚本,使其允许名称包含空格的子文件夹 #!/bin/bash LIB="." for file in $(find $LIB -name '*.NEF'); do UUID=`uu

我正在尝试为我的数码单反相机拍摄的照片添加唯一的ID。DSLR同时保存原始文件(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
使用循环或
查找
,而不是两者都使用

# 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" "$1" -ImageUniqueID=$uuid -overwrite_original;
     exiftool -q -if "not \$ImageUniqueID" "${1%.NEF}.JPG" -ImageUniqueID=$uuid -overwrite_original
     ' _ {} \;
使用循环或
查找
,而不是两者都使用

# 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" "$1" -ImageUniqueID=$uuid -overwrite_original;
     exiftool -q -if "not \$ImageUniqueID" "${1%.NEF}.JPG" -ImageUniqueID=$uuid -overwrite_original
     ' _ {} \;

exiftool的启动时间是其最大的性能影响,每个文件运行一次将显著增加运行时间,特别是在处理数百(如果不是数千)个文件时

除非您特别需要uuidgen生成的id类型,否则exiftool必须能够使用
NewGUID
标记创建唯一的id。如上所列,它由“格式为YYYYmmdd-HHMM-SSNN-PPPP-RRRR的新随机GUID组成,其中Y=年,m=月,d=日,H=小时,m=分钟,S=秒,N=十六进制文件序列号,P=十六进制进程ID,R=随机十六进制数”。可以在标记名的末尾添加一个hashtag(例如,
NewGUID#
),以抑制破折号

然后您可以运行

exiftool-overwrite_original-ext Nef-r-q-如果'not$ImageUniqueID'-ImageUniqueIDexiftool的启动时间是其最大的性能影响,为每个文件运行一次将显著增加运行时间,特别是在处理成百上千个文件时

除非您特别需要uuidgen生成的id类型,否则exiftool必须能够使用
NewGUID
标记创建唯一的id。如上所列,它由“格式为YYYYmmdd-HHMM-SSNN-PPPP-RRRR的新随机GUID组成,其中Y=年,m=月,d=日,H=小时,m=分钟,S=秒,N=十六进制文件序列号,P=十六进制进程ID,R=随机十六进制数”。可以在标记名的末尾添加一个hashtag(例如,
NewGUID#
),以抑制破折号

然后您可以运行

exiftool-overwrite_original-ext Nef-r-q-if'not$ImageUniqueID'-ImageUniqueIDYou可能想看一看。改用类似的方式:
find“$LIB”-键入f-name'*.Nef'-print0 |,而IFS=read-d$'\0'-r fl;执行…<使用“$fl”编码>;完成
。这将使用null作为分隔符,并且应在所有情况下都有效您可能想看一看。请改用类似的方式:
find“$LIB”-键入f-name'*.NEF'-print0;,而IFS=read-d$'\0'-r fl;执行…<使用“$fl”编码>;完成
。这将使用null作为分隔符,并且应在所有情况下都有效循环示例在macOS上似乎不起作用;但是,查找示例确实如此。
globstar
需要
bash
4(于2009年初发布),但macOS仍提供3.2版(出于许可原因,IIUC)。对于任何需要更多POSIX兼容shell的脚本,最好安装一个现代版本的
bash
,或者使用
zsh
(macOS中提供了一个现代版本)。(macOS中也提供了最新版本的
ksh
,但出于各种原因,我从未真正使用过它;这也是一个选项。)循环示例在macOS上似乎不起作用;但是,查找示例确实如此。
globstar
需要
bash
4(于2009年初发布),但macOS仍提供3.2版(出于许可原因,IIUC)。对于任何需要更多POSIX兼容shell的脚本,最好安装一个现代版本的
bash
,或者使用
zsh
(macOS中提供了一个现代版本)。(macOS中也提供了最新版本的
ksh
,但出于各种原因,我从未真正使用过它;这也是一个选项。)