为什么带有后缀的 basename 在与 find 一起使用时在子 shell 中不起作用?

Why basename with a suffix doesn't work in a subshell when used with find?

下面的命令没有进行替换,为什么?

find ./ -name "*.dng" -exec echo `basename \{\} .dng`  \;

但是这个命令有效:

find ./ -name "*.dng" -exec basename \{\} .dng  \;

我实际上想做的是找到我硬盘中的所有 dng 并执行:

touch -c -r {basename}.RW2  {basename}.dng

The following command doesn't do the subtitution, why?

find ./ -name "*.dng" -exec echo `basename \{\} .dng`  \;

正如 Cyrus 在 his comment 中所说,bash 在调用 find 之前将 `basename \{\} .dng` 扩展为 {};所以 find 收到的只是 echo {},它没有看到 `basename \{\} .dng` 部分。

What I'm actually trying to do is to find all the dng in my hard drive and do:

touch -c -r {basename}.RW2 {basename}.dng

假设每个参考文件 (*.RW2) 与相应的 .dng 文件位于同一目录中,我会这样做:

find . -name '*.dng' -exec sh -c '
for dng do
  touch -c -r "${dng%.*}.RW2" "$dng"
done' _ {} +