![在bash中结合basename {}和string的操作](https://linux22.com/image/97583/%E5%9C%A8bash%E4%B8%AD%E7%BB%93%E5%90%88basename%20%7B%7D%E5%92%8Cstring%E7%9A%84%E6%93%8D%E4%BD%9C.png)
我想编写一个脚本来查找所有以 结尾的文件.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
,否则,它导致安全脆弱。