Linux

在算術計算中使用萬用字元輸出作為變數

  • October 5, 2017

我的文件名稱和目錄路徑如下:

t10n2/data/file.dat0, t10n2/data/file.dat1, t10n2/data/file.dat2, …

我希望使用涉及變數$1$2int10n$1的算術運算來更改文件的dat$2名稱,以便將文件名更改為file.dat$(($1*5 + $2)).

特別是,我想我想知道的是如何在算術運算中使用萬用字元的輸出!*作為變數?剩下的我可以做。

使用 Perl rename

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

-n當您對結果滿意時刪除。

使用 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

引用自:https://unix.stackexchange.com/questions/396317