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