特殊文字の後のすべての内容を削除するには、名前を変更します。

特殊文字の後のすべての内容を削除するには、名前を変更します。

私は最近Perlベースの機能を見つけましたが、renamePerlについて何も知らないので、それは正しく使用されません。このトピックについて多くの質問を見つけましたが、何も役に立ちませんでした。

名前を変更したい

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)が必要です。これがまさにginがある理由です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に置き換えます。左側の()を.エスケープする必要があります。問題ではありません。.\..

おすすめ記事