在一个系统(我的)上,我有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
?)
在另一个我不完全知道的系统上,我看到find
is 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 时总是应该的那样)。