Rename

重命名目錄中的所有文件以添加前導零 - 對於具有不同“詞幹”的文件名

  • May 21, 2018

我有一個包含大量文件的目錄。這些文件根據以下系統命名:“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 上有很多相關的問題,但所有這些問題似乎都是所有文件共享同一個詞幹的案例。我已經銷毀了幾個試圖應用這些解決方案的文件)

您希望NinVar1_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循環末尾的註釋以實際重命名文件。

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