Rename
重命名目錄中的所有文件以添加前導零 - 對於具有不同“詞幹”的文件名
我有一個包含大量文件的目錄。這些文件根據以下系統命名:“Var1_X_Var2_Y_Var3_Z_data_N.txt” 其中 X、Y 和 Z 是許多不同的數字,N 的範圍從 1 到 30。
要在我的下一個腳本中使用這些文件,我需要為 N 為 1 到 9 的文件添加前導零。
在我的 ubuntu 機器上,我使用以下命令
rename 's/_1.txt/_01.txt/' *
並從 1 到 9 重複。
但是,此命令不適用於我正在使用的集群。我需要一個 unix 或 bash 或 python 替代品。
(注意:我知道在 stackexchange 上有很多相關的問題,但所有這些問題似乎都是所有文件共享同一個詞幹的案例。我已經銷毀了幾個試圖應用這些解決方案的文件)
您希望
N
inVar1_X_Var2_Y_Var3_Z_data_N.txt
是一個零填充的兩位整數。假設所有受影響的文件都匹配模式
*_[0-9].txt
:for name in *_[0-9].txt; do stem="${name%.txt}" # remove the ".txt" suffix num=${stem##*_} # extract the number at the end newname="${stem%[0-9]}$( printf '%02d.txt' "$num" )" # put it back together printf 'Would rename "%s" into "%s"\n' "$name" "$newname" # mv -- "$name" "$newname" done
${name%.txt}
從原始文件名.txt
的末尾刪除。$name
這創建了“詞幹”,它不是真正的詞幹,因為它的最後仍然有數字。${stem##*_}
刪除直到並包括最後一個下劃線在內的所有內容$stem
。${stem%[0-9]}
是結尾沒有數字的詞幹(例如Var1_X_Var2_Y_Var3_Z_data_
)。printf '%02d.txt' "$num"
從 生成一個填充零的兩位數$num
,後跟字元串.txt
。給定一個包含文件的目錄
Var1_X_Var2_Y_Var3_Z_data_1.txt Var1_X_Var2_Y_Var3_Z_data_23.txt Var1_X_Var2_Y_Var3_Z_data_10.txt Var1_X_Var2_Y_Var3_Z_data_24.txt Var1_X_Var2_Y_Var3_Z_data_11.txt Var1_X_Var2_Y_Var3_Z_data_25.txt Var1_X_Var2_Y_Var3_Z_data_12.txt Var1_X_Var2_Y_Var3_Z_data_26.txt Var1_X_Var2_Y_Var3_Z_data_13.txt Var1_X_Var2_Y_Var3_Z_data_27.txt Var1_X_Var2_Y_Var3_Z_data_14.txt Var1_X_Var2_Y_Var3_Z_data_28.txt Var1_X_Var2_Y_Var3_Z_data_15.txt Var1_X_Var2_Y_Var3_Z_data_29.txt Var1_X_Var2_Y_Var3_Z_data_16.txt Var1_X_Var2_Y_Var3_Z_data_3.txt Var1_X_Var2_Y_Var3_Z_data_17.txt Var1_X_Var2_Y_Var3_Z_data_30.txt Var1_X_Var2_Y_Var3_Z_data_18.txt Var1_X_Var2_Y_Var3_Z_data_4.txt Var1_X_Var2_Y_Var3_Z_data_19.txt Var1_X_Var2_Y_Var3_Z_data_5.txt Var1_X_Var2_Y_Var3_Z_data_2.txt Var1_X_Var2_Y_Var3_Z_data_6.txt Var1_X_Var2_Y_Var3_Z_data_20.txt Var1_X_Var2_Y_Var3_Z_data_7.txt Var1_X_Var2_Y_Var3_Z_data_21.txt Var1_X_Var2_Y_Var3_Z_data_8.txt Var1_X_Var2_Y_Var3_Z_data_22.txt Var1_X_Var2_Y_Var3_Z_data_9.txt
..那個循環會產生
Would rename "Var1_X_Var2_Y_Var3_Z_data_1.txt" into "Var1_X_Var2_Y_Var3_Z_data_01.txt" Would rename "Var1_X_Var2_Y_Var3_Z_data_2.txt" into "Var1_X_Var2_Y_Var3_Z_data_02.txt" Would rename "Var1_X_Var2_Y_Var3_Z_data_3.txt" into "Var1_X_Var2_Y_Var3_Z_data_03.txt" Would rename "Var1_X_Var2_Y_Var3_Z_data_4.txt" into "Var1_X_Var2_Y_Var3_Z_data_04.txt" Would rename "Var1_X_Var2_Y_Var3_Z_data_5.txt" into "Var1_X_Var2_Y_Var3_Z_data_05.txt" Would rename "Var1_X_Var2_Y_Var3_Z_data_6.txt" into "Var1_X_Var2_Y_Var3_Z_data_06.txt" Would rename "Var1_X_Var2_Y_Var3_Z_data_7.txt" into "Var1_X_Var2_Y_Var3_Z_data_07.txt" Would rename "Var1_X_Var2_Y_Var3_Z_data_8.txt" into "Var1_X_Var2_Y_Var3_Z_data_08.txt" Would rename "Var1_X_Var2_Y_Var3_Z_data_9.txt" into "Var1_X_Var2_Y_Var3_Z_data_09.txt"
刪除
mv
循環末尾的註釋以實際重命名文件。