私は最近Perlベースの機能を見つけましたが、rename
Perlについて何も知らないので、それは正しく使用されません。このトピックについて多くの質問を見つけましたが、何も役に立ちませんでした。
名前を変更したい
filename - y01m01 - extra.log
filename - y01m02 - extra.log
filename - y01m03 - extra.log
...
filename - y05m12 - extra.log
入力する
filename-y01m01.log
filename-y01m02.log
filename-y01m03.log
...
filename-y05m12.log
名前を次に変更しました。
filename-y01m01 - extra.log
filename-y01m02 - extra.log
filename-y01m03 - extra.log
...
filename-y05m12 - extra.log
rename 's/filename - y*/filename-y/ *.log
使用していますが、最後にこの文字列を削除する方法がわかりません。- extra
の文字数は- extra
固定されておらず、ファイルごとに異なるため、拡張子の前の8文字を変更することはできません。
解決策は(スペースを含む)以降のすべてを変更するようですが、コーディング方法がわかりません。
ご協力ありがとうございます。
答え1
このperl-rename
コマンドは正規表現のみを使用します。 Perlなので、非常に強力なPerl準拠の正規表現言語(PCRE)を使用してください。したがって、使用方法を学びたい場合は、PCREを探してください。
この場合、ファイル名からすべてのスペースを削除して文字列を削除したいようです-extra
。両方の操作が利用可能で、次のように区別することができます;
。
$ rename -n 's/ //g; s/-extra//' *.log
filename - y01m01 - extra.log -> filename-y01m01.log
filename - y01m02 - extra.log -> filename-y01m02.log
filename - y01m03 - extra.log -> filename-y01m03.log
filename - y05m12 - extra.log -> filename-y05m12.log
s/ //g
「すべてのスペースを空白スペースに置き換える」(したがって、すべてのスペースを削除)を意味します。デフォルトでは、ここで使用されている代替演算子(s/old/new/options
)は最初の項目のみを置き換えます。すべての一致を置き換えるには、「グローバル」オプション(g
)が必要です。これがまさにg
inがある理由ですs/ //g
。
justはs/-extra//
「最初の一致を-extra
何もないものに置き換える」を意味します。
必要に応じて機能する場合は、使用せずに再実行してください。これにより、実際に実行せずに実行するジョブを印刷-n
できます。rename
テストに非常に便利です!
-extra
静的文字列ではありませんが、変更できる場合は、-
最後の文字列から次の文字列の前までのすべての項目を削除できます.
。
$ rename -n 's/ //g; s/-[^-]*\././' *.log
filename - y01m01 - extra.log -> filename-y01m01.log
filename - y01m02 - extra.log -> filename-y01m02.log
filename - y01m03 - extra.log -> filename-y01m03.log
filename - y05m12 - extra.log -> filename-y05m12.log
ここではs/ //g
、すべてのスペースが以前のように削除されます。つまり、s/-[^-]*\././
「aを検索し-
てから、後ろにaで終わる最も長いゼロ以上の-
文字以外の項目を見つけて.
全体をaに置き換えます。左側の()を.
エスケープする必要があります。問題ではありません。.
\.
.
答え2
2回の交換が可能です。一度は、最初の交換後に部品を交換し、すべての-
スペースを交換します。
rename -nv -- 's/-\s\w+[.]log$/.log/; s/\s+//g' *.log
交換が期待どおりに行われたと判断された場合は、-n
フラグを立ててください。
答え3
次の提案を試してください。
rename 's/(filename - y.*) - .*(\.log)/$1$2/' *.log