Bash
使用 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
?)在另一個我不完全了解的系統上,我看到
find
isfind (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 時一樣)。