为什么带有后缀的 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' _ {} +
下面的命令没有进行替换,为什么?
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' _ {} +