web-dev-qa-db-ja.com

複数の.txtファイルの名前を変更して、特定の位置の一部の文字を変更します

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. 

編集

例のように、数字の位置は常に同じです。ファイルには順序のロジックがあるため、名前変更プロセスは完全に正しい必要があります。

コマンドラインを使用してどうすればよいですか?

5

さて、楽しみのために、間違いなく短い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]]
    )
    
6
Jacob Vlijm

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のような代替シンボリックリンクがあります

8
glenn jackman

シェルスクリプト

パッケージ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
$ 
5
sudodus

これには、Perlの名前変更ユーティリティが最適なオプションだと思います。

rename 's/(\w)0(\d)/$1$2/g' *.txt

このコマンドは、現在のディレクトリ内のすべてのテキストファイルについて、文字とゼロを破棄しながら数字と数字を保持する、ゼロが続くすべての文字を置換します。

2
Bruce H

zshを使用:

autoload zmv
zmv 'a(<->)_s(<->)_e(<->)_skeleton.txt' 'a${1#0}_s${2#0}_e${3#0}_skeleton.txt'
1
Roman Odaisky