重命名目录中的所有文件以添加前导零 - 对于具有不同“茎”的文件名

重命名目录中的所有文件以添加前导零 - 对于具有不同“茎”的文件名

我有一个包含大量文件的目录。这些文件根据以下系统命名:“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 上有很多相关问题,但所有这些问题似乎都使用所有文件共享相同主干的情况。我已经销毁了几个试图应用这些解决方案的文件)

答案1

您希望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删除循环末尾的注释以实际重命名文件。

答案2

find -name "*_[1-9].txt" -exec sh -c 'echo $1 ${1%_*}_0${1##*_}' _ {} \;
  • 正在$1替换为找到的文件。
  • 正在${1%_*}删除一切最后一个下划线和下划线本身。
  • _0只是打印一个下划线后跟一个零。
  • ${1##*_}会删除所有内容最后一个下划线和下划线本身。

替换echomv用于对文件进行重命名。


我用它来打包 3o 个文件

touch Var1_${RANDOM}_Var2_${RANDOM}_Var3_${RANDOM}_data_{1..30}.txt

相关内容