「茎」が異なるファイル名の場合は、ディレクトリにすべてのファイル名を変更して、先頭にゼロを追加します。

「茎」が異なるファイル名の場合は、ディレクトリにすべてのファイル名を変更して、先頭にゼロを追加します。

多くのファイルを含むディレクトリがあります。ファイル名は、「Var1_X_Var2_Y_Var3_Z_data_N.txt」システムに従って指定されます。ここで、X、Y、Zはさまざまな数字で、Nの範囲は1〜30です。

次のスクリプトでこのファイルを使用するには、1から9までのNを持つファイルに前に0を追加する必要があります。

私のUbuntuコンピュータでは、次のコマンドを使用します。

rename  's/_1.txt/_01.txt/' *

1から9まで繰り返します。
ただし、このコマンドは私が使用しているクラスタでは機能しません。 Unix、bash、またはPythonの代替が必要です。

(注:stackexchangeには多くの質問があることがわかりましたが、すべてのファイルが同じトランクを共有している状況を利用しているようです。これらのソリューションを適用しようとすると、複数のファイルが破棄されました。)

答え1

0で埋められた2桁の整数を入力しようとしていNます。Var1_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"ゼロで埋められた2桁の数字と$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##*_}すべてのアイテムが削除されます。今後最後の下線と下線自体。

ファイル名を変更するには、echo次のように変更します。mv


3oファイルのパッケージングに使用しました。

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

関連情報