bashでbasename {}と文字列操作を組み合わせる

bashでbasename {}と文字列操作を組み合わせる

.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。そうでなければセキュリティの脆弱性につながります。

関連情報