Ubuntu 16.04の同じフォルダに何百もの.txtファイルがあり、それらは文字列とインデックス番号で命名されているようなものです。
a01_s01_e01_skeleton.txt
a01_s01_e02_skeleton.txt
a01_s01_e03_skeleton.txt
a01_s02_e01_skeleton.txt
...
a20_s10_e02_skeleton.txt
...
10より小さい番号の.txtファイルから0(ゼロ)を削除しなければならないので、最終的に私は'を持っています。
instead of : a01_s01_e01_skeleton.txt
it will be: a1_s1_e1_skeleton.txt #notice that the 0s are gone.
**編集
数字の位置は、例のように常に同じです。ファイルには順序の論理があるので、リネーム処理は完全に正しく行わなければなりません。
コマンドラインを使ってどうすればいいのでしょうか?
perl の rename
を使うと、数字以外と数字の間に発生するゼロを取り除くことができる。
$ touch a01_s01_e01_skeleton.txt a01_s01_e02_skeleton.txt a01_s01_e03_skeleton.txt a01_s02_e01_skeleton.txt a20_s10_e02_skeleton.txt
$ rename -n 's/(?<=\D)0+(?=\d)//g' *.txt
rename(a01_s01_e01_skeleton.txt, a1_s1_e1_skeleton.txt)
rename(a01_s01_e02_skeleton.txt, a1_s1_e2_skeleton.txt)
rename(a01_s01_e03_skeleton.txt, a1_s1_e3_skeleton.txt)
rename(a01_s02_e01_skeleton.txt, a1_s2_e1_skeleton.txt)
rename(a20_s10_e02_skeleton.txt, a20_s10_e2_skeleton.txt)
renameは perl のバージョンである場合もあれば、そうでない場合もあります。私のシステムでは [
file-rename](http://manpages.ubuntu.com/manpages/bionic/en/man1/file-rename.1p.html) と呼ばれ、
/usr/bin/rename` という代替シンボリックリンクがあります。
しかし、Pythonでは、ディレクトリが(あなたが言うように)"flat"で、*中のすべてのファイルが名前を変更するのに有効なファイルであれば、以下のスクリプトは仕事をします。そうでない場合は、例外を追加する必要があります。
import shutil
import sys
import os
dr = sys.argv[1]
for f in os.listdir(dr):
sections = f.split("_")
newname = "_".join(
[s[0] + str(int(s[1:])) for s in sections[:3]] + [sections[-1]]
)
shutil.move(os.path.join(dr, f), os.path.join(dr, newname))
コードを空のファイルにコピーし、rename_stuff.py
という名前で保存します。
ディレクトリを引数として実行する。
python3 /path/to/rename_stuff.py </directory/with/files>.py /path/to/rename_stuff.py </directory/with/files>
いつものように、まずはサンプルディレクトリで試してみてください。
ディレクトリ内のファイルを読み込みます。
for f in os.listdir(dr):
名前を"_"で分割してください。
セクション = f.split("_")
最初の3つのセクションで、2桁(またはそれ以上)の数字をそのイント値("real")に置き換えます(01 -> 1, 10 -> 10, 020 -> 20, 000300 -> 300 といった具合です)。
その後、各セクションを再び接着します。
newname = "_".join(
[s[0] + str(int(s[1:])) for s in sections[:3]] [s[0] + str(int(s[1:]) for s in sections[:3])+ [セクション[-1]]
)
util-linuxパッケージからインストールした rename
エイリアス rename.ul
を使って、以下のbashシェルスクリプトを作成しました。
#!/bin/bash
#####################
doer () {
# removes "0" from the string "{parameter}0"
# for example a0 --> a
rename "s/${1}0/$1/" *
}
#####################
# main
#####################
doer a
doer s
doer e
このシェルスクリプトを renamer
と呼び、実行権限を与えてみましょう。
削除するゼロの前に a,s,e 以外の文字がある場合、それらの文字で doer
を呼び出すようにし、サンプルファイル名にはない、より詳細な置換指定(関数 doer
)が必要な場合があれば、シェルスクリプトを修正してください。
オリジナルファイルの作成と確認
$ touch a01_s01_e01_skeleton.txt a01_s01_e02_skeleton.txt a01_s01_e03_skeleton.txt a01_s02_e01_skeleton.txt a20_s10_e02_skeleton.txt
$ ls -1
a01_s01_e01_skeleton.txt
a01_s01_e02_skeleton.txt
a01_s01_e03_skeleton.txt
a01_s02_e01_skeleton.txt
a20_s10_e02_skeleton.txt
renamer
シェルスクリプトの実行
$ ./renamer
結果を確認する
$ ls -1
a1_s1_e1_skeleton.txt
a1_s1_e2_skeleton.txt
a1_s1_e3_skeleton.txt
a1_s2_e1_skeleton.txt
a20_s10_e2_skeleton.txt
renamer
$