Bash

使用 find … -exec sh -c 重命名文件在特定係統上不起作用 - “錯誤替換”

  • April 29, 2021

在一個系統(我的)上,我有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
...

誰能幫我理解後一個系統可能出了什麼問題?

sh可能是第二個系統中的破折號或另一個 POSIX shell。${var/pat/rep}不是POSIX 參數擴展,因此 POSIXsh不需要它。由於這個系統有 GNU find,它可能也有 bash,所以bash -c請改用(就像使用 bashisms 時一樣)。

引用自:https://unix.stackexchange.com/questions/647229