私のファイルの名前とディレクトリパスは次のとおりです。
t10n2/data/file.dat0, t10n2/data/file.dat1, t10n2/data/file.dat2, ...
$1
$2
変数とinを含むt10n$1
算術演算を使用してファイルdat$2
名をに変更したいと思いますfile.dat$(($1*5 + $2))
。
特に私が知りたいのは算術演算!
や変数の出力にワイルドカードを使う方法ではないかと思います。*
残りは私ができます。
答え1
パールを使うrename
:
prename -n 's!t10n(\d+)/data/file.dat\K(\d+)!$1*5+$2!e' t10n*/data/file.dat*
-n
結果が満足であれば削除してください。
答え2
バッシュ使用:
for file in t10*/data/file.dat*
do
if [[ $file =~ (t10n([[:digit:]]+)/data/file.dat)([[:digit:]]+) ]]
then
echo mv -- "$file" "${BASH_REMATCH[1]}$(( ${BASH_REMATCH[2]} * 5 + ${BASH_REMATCH[3]} ))"
fi
done
難しい作業は、テスト作業=~
の正規表現演算子によって実行されます[[
。興味のある要素を取得するには、括弧で囲まれた3つの式があります。
- ほとんどのファイル名、とは別に末尾
dat
の数字 t10n
数字dat
数字
ファイルがパターンと一致する場合、結果の値はBASH_REMATCH配列にあるため、それを使用して新しいファイル名を計算します。
echo
結果が正確に見える場合は削除してください。
入力例:
mkdir -p t10n2/data t10n3/data
touch t10n2/data/{file.dat0,file.dat1,file.dat2}
touch t10n3/data/{file.dat0,file.dat1,file.dat2}
出力例:
mv -- t10n2/data/file.dat0 t10n2/data/file.dat10
mv -- t10n2/data/file.dat1 t10n2/data/file.dat11
mv -- t10n2/data/file.dat2 t10n2/data/file.dat12
mv -- t10n3/data/file.dat0 t10n3/data/file.dat15
mv -- t10n3/data/file.dat1 t10n3/data/file.dat16
mv -- t10n3/data/file.dat2 t10n3/data/file.dat17
答え3
そしてzsh
:
autoload zmv # best in ~/.zshrc
zmv -n 't10n(<->)/data/file.dat(<->)' '$f:r.dat$(($1 * 5 + $2))'
(満足している場合は削除してください-n
(ドライランの場合))。
答え4
探す+強く打つ+sed解決策:
find . -type f -path "*t[0-9]*n[0-9]*/data/file.dat[0-9]*" -exec bash -c 'f=$1;
read v1 v2 < <(sed -E "s#.*/t[0-9]+n([0-9]+)/data/file\.dat([0-9]+)\$#\1 \2#" <<<"$f");
mv "$f" "${f/.dat[0-9]*/.dat}$(($v1*5+$v2))"' x {} \;
read v1 v2 ...
t10n<number>
- と変数からそれぞれdat<number>
キー数値を読み込みます。v1
v2