使用 find ... -exec sh -c 重命名文件在特定系统上不起作用 - “错误替换”

使用 find ... -exec sh -c 重命名文件在特定系统上不起作用 - “错误替换”

在一个系统(我的)上,我有find (GNU findutils) 4.8.0,当我运行以下命令时

find . -name '*.cpp' -exec sh -c 'f=$0; echo mv "$f" "${f/cpp/CPP}"' {} \;

我得到一个这样的列表:

mv ./stuff.cpp ./stuff.CPP
mv ./main.cpp ./main.CPP
...

每个匹配文件占一行。

(顺便说一句,您能否指出一个肯定存在的答案,我明白为什么更改\;\+会导致处理一个文件,以便输出是mv ./stuff.cpp ./stuff.CPP?)

在另一个我不完全知道的系统上,我看到findis find (GNU findutils) 4.6.0.225-235f,上面的命令给出了这些错误:

./unittest/tTransform3.cpp: 1: ./unittest/tTransform3.cpp: Bad substitution
./unittest/tTransform2.cpp: 1: ./unittest/tTransform2.cpp: Bad substitution
...

有人能帮助我了解后一个系统可能出了什么问题吗?

答案1

sh可能是第二个系统中的 dash 或另一个 POSIX shell。${var/pat/rep}不是POSIX 参数扩展,所以 POSIXsh不需要它。由于该系统有 GNU find,它可能也有 bash,因此请使用它bash -c(就像使用 bashisms 时总是应该的那样)。

相关内容