在bash中结合basename {}和string的操作

在bash中结合basename {}和string的操作

我想编写一个脚本来查找所有以 结尾的文件.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,否则,它导致安全脆弱。

相关内容