在算术计算中使用通配符输出作为变量

在算术计算中使用通配符输出作为变量

我的文件的名称和目录路径如下:

t10n2/数据/文件.dat0, t10n2/数据/文件.dat1, t10n2/数据/文件.dat2, ...

$1我希望使用涉及变量and $2int10n$1和 的算术运算来更改文件名dat$2,以便将文件名更改为file.dat$(($1*5 + $2)).

特别是,我想我想知道的是如何在算术运算中使用通配符!或作为变量的输出?*剩下的我可以做。

答案1

使用 Perl rename

prename -n 's!t10n(\d+)/data/file.dat\K(\d+)!$1*5+$2!e' t10n*/data/file.dat*

-n当您对结果满意时删除。

答案2

使用bash:

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

繁重的工作是由测试操作=~中的正则表达式运算符完成的[[。为了获取我们感兴趣的元素,有三个带括号的表达式:

  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

相关内容