我想編寫一個腳本來查找所有以 結尾的文件.cpp
並將它們重命名為.cc
.搜尋將從起始路徑 R(腳本的參數)開始遞歸地完成。
如果未寫入參數,R 將是實際目錄。
我已經寫過:
#!/bin/bash
R=.
if [[ $# == 1 ]]
then
echo "$# == 1"
if [[ -d $1 ]]
echo "$1 is directory"
then
R=$1
else
printf "Error $1 should be a directory"
exit 1
fi
find $R -name "*.cpp" -exec sh -c 'mv {} $(dirname {})${$(basename {})%.cpp}".cc" ' \;
exit 0
else
printf "Invocation is: $0 directory"
exit 1
fi
但我知道我在查找行時遇到了麻煩,因為我不知道如何表達我想在使用 {} 時刪除擴展並附加新擴展
答案1
不要直接在 上操作來做這樣的事情{}
。
您已經使用了 inline sh
,因此將其作為參數傳遞給它,而且您根本{}
不需要使用:basename
find "$R" -name "*.cpp" -type f -exec sh -c '
for f do
mv -- "$f" "${f%.*}.cc"
done
' sh {} +
請注意,您必須使用雙引號$R
,否則,它導致安全脆弱。