算術計算でワイルドカード出力を変数として使用する

算術計算でワイルドカード出力を変数として使用する

私のファイルの名前とディレクトリパスは次のとおりです。

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つの式があります。

  1. ほとんどのファイル名、とは別に末尾datの数字
  2. t10n数字
  3. 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>キー数値を読み込みます。v1v2

関連情報