Regular-Expression

在保留文本的同時重命名編號文件

  • January 11, 2020

我正在嘗試重命名一組文件。文件有這種形式

frame\[d]+_object.bin

我的文件編號從 1 到 1500,我只想重命名 100 到 199 之間的文件

我嘗試了以下rename命令

rename -n 's/frame1[\d]{2}_/sprintf("%05d", $&)/e' *.bin

調整我用於其他目的的其他命令,但輸出是

frame198_simobject0.bin -> 00000simobject0.bin
frame199_simobject0.bin -> 00000simobject0.bin

我真的不明白命令的替換規則是如何工作的,所以這裡的一些幫助會非常有用。

$&是整個匹配的字元串 - 包括前導frame和尾隨_。由於這是非數字的,因此嘗試對其進行格式化的嘗試%05d失敗。

你可能想要類似的東西s/frame(1\d{2})_/sprintf("frame%05d_", $1)/e

前任。

$ rename -n 's/frame(1\d{2})_/sprintf("frame%05d_", $1)/e' *.bin
rename(frame198_simobject0.bin, frame00198_simobject0.bin)
rename(frame199_simobject0.bin, frame00199_simobject0.bin)

請注意,您不需要[...]\d.

如果您只想重命名文件的子集,一個簡單的解決方案是只將這些文件傳遞給rename. 因此,不要使用 ,而是*bin使用大括號擴展,只選擇具有正確名稱的文件:

rename -n 's/frame(\d+)_/sprintf("%05d", $1)/e'  frame{100..199}_simobject0.bin

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