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そうしないと、セキュリティの脆弱性につながります。

関連情報