Linux
在算術計算中使用萬用字元輸出作為變數
我的文件名稱和目錄路徑如下:
t10n2/data/file.dat0, t10n2/data/file.dat1, t10n2/data/file.dat2, …
我希望使用涉及變數
$1
和$2
int10n$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
繁重的工作由測試操作
=~
中的正則表達式運算符完成。[[
為了獲取我們感興趣的元素,有三個帶括號的表達式:
- 文件名的大部分,除了尾隨
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