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
...
every .txtファイルから(ゼロ)を削除する必要があります。この場合、数値は10より小さいため、最終的には次のようになります。
instead of : a01_s01_e01_skeleton.txt
it will be: a1_s1_e1_skeleton.txt #notice that the 0s are gone.
編集
例のように、数字の位置は常に同じです。ファイルには順序のロジックがあるため、名前変更プロセスは完全に正しい必要があります。
コマンドラインを使用してどうすればよいですか?
さて、楽しみのために、間違いなく短いcliソリューションがありますが、Pythonでは、以下のスクリプトが仕事をしますifディレクトリは「フラット」です(あなたが言うように)and =その中のすべてのファイルは、名前を変更する有効なファイルです。そうでない場合は、例外を追加する必要があるため、ここに進みます。
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>
いつものように、まずサンプルディレクトリを試してください。
ディレクトリ内のファイルを読み取ります。
for f in os.listdir(dr):
名前を「_」で分割します。
sections = f.split("_")
最初の3つのセクションで、2桁(またはそれ以上)の数字をそのint-(「実」)値に置き換えます。したがって、01-> 1、10-> 10、020-> 20、000300-> 300などです。 。
その後、セクションを再び接着します。
newname = "_".join(
[s[0] + str(int(s[1:])) for s in sections[:3]] + [sections[-1]]
)
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
と呼ばれ、/usr/bin/rename
のような代替シンボリックリンクがあります
パッケージutil-linuxからインストールされたrename
alias 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
$
これには、Perlの名前変更ユーティリティが最適なオプションだと思います。
rename 's/(\w)0(\d)/$1$2/g' *.txt
このコマンドは、現在のディレクトリ内のすべてのテキストファイルについて、文字とゼロを破棄しながら数字と数字を保持する、ゼロが続くすべての文字を置換します。
zshを使用:
autoload zmv
zmv 'a(<->)_s(<->)_e(<->)_skeleton.txt' 'a${1#0}_s${2#0}_e${3#0}_skeleton.txt'