4

しばらくお待ちください。この投稿はやや長くなります...

私はたくさんのファイルを持っています、それらのいくつかはシンプルでクリーンな名前(例えば1E01.txt)であり、いくつかはたくさんの余分なものがあります:

Sample2_Name_E01_-co_032.txt
Sample2_Name_E02_-co_035.txt
...
Sample12_Name_E01_-co_061.txt

等々。ここで重要なのは、「サンプル」の後の数字と「名前」の後の文字+数字です。残りは使い捨てです。重要でない部分を削除すると、ファイル名は「クリーンな」ファイル名(2E01.txt、2E02.txt、...、12E01.txt)と同じパターンになります。私は次の式でファイルの名前を変更することができました(これは自分で思いついたものです。非常にエレガントかどうかはわかりませんが、正常に機能します)。

rename -v 's/Sample([0-9]+)_Name_([A-Z][0-9]+).*/$1$2\.txt/' *.txt

次に、2番目の部分は、1E01.txtが01E01.txtに変わるなど、1桁のファイル名に先行ゼロを追加することです。私はこれに成功しました(別のStackExchange投稿でこれを見つけて変更しました):

rename -v 'unless (/^[0-9]{2}.*\.txt/) {s/^([0-9]{1}.*\.txt)$/0$1/;s/0*([0-9]{2}\..*)/$1/}' *.txt

だから私はついに私の質問にたどり着きました:1つの名前変更コマンドで両方の式をマージする方法はありますか?プロセスを自動化するためにbashスクリプトを実行できることは知っていますが、必要なのは、ワンパスの名前変更ソリューションを見つけることです。

ありがとう

4

2 に答える 2

11

このコマンドを試して、名前1-file.txtを次のように変更できます0001-file.txt

# fill zeros
$ rename 's/\d+/sprintf("%04d",$&)/e' *.txt

必要に応じてコマンドを少し変更できます。

于 2012-11-06T12:13:10.123 に答える
1

それが「解析」正規表現である場合、そのパターンに一致するファイルに対してスクリプトが処理できるファイルを制限しています。したがって、sprintf同じリテラル文字列を使用することは、より特殊なケースではなく、次のようにすることができます。

s{Sample(\d+)_Name_(\p{IsUpper})(\d+)}
 {sprintf "Sample%02d_Name_%s%03d", $1, $2, $3}e
 ;

ここでは、同じ既知の機能を再度使用し、付随する数値を単純にフォーマットしています。

  • /eスイッチは「eval」用で、一致ごとに置換を Perl として評価します。
  • あなたの式のいくつかをより標準的な文字クラス記号に名前を変更しました:[A-Z]プロパティ クラス\p{IsUpper}[0-9]なり、数字コード\d( も可能\p{IsDigit}) になります。
于 2012-11-06T12:15:22.830 に答える