名前変更を使用した複数ファイルの名前変更

名前変更を使用した複数ファイルの名前変更

ファイル名を一括変更する必要があります。私が見た他の質問では、問題は正しく解決されませんでした。私のファイル名は決定的に生成されるため、名前がどのように割り当てられるかを予測することはできません。私はそれがNORMALで始まり終わるということを知っています-lib*。その間のすべてを文字列に変更したいと思いますX。例えば、

|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.concordant
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.deletion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.divergent
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.inversion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.translocation
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.concordant
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.deletion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.divergent
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.insertion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.inversion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.translocation

だからこんな形になることもあるでしょうがrename "s/something/X/"、正規表現をどのように使うのか分からないのでどんな形にすべきかわかりません。

答え1

便利なPerlドライバがrenameすべてのディストリビューションで常に利用できるわけではありません。たとえば、FedoraとCentOS(そしておそらくRedHat)はデフォルトのrenameユーティリティを使用してデフォルトの検索と置換のみを実行します。

運が悪く、これらのいずれかが利用できない場合は、次の方法が役に立ちます。

for oldname in *; do
    newname=$(echo "$oldname" | sed -e 's/\(NORMAL\).*\(-lib.*\)/\1X\2/')
    mv "$oldname" "$newname"
done

答え2

rename幸運にもアクセスできる場合は、次の点で十分です。

rename 's/(NORMAL).*(-lib)/$1X$2/' *

答え3

Debianおよびその派生プログラムrename(Ubuntu、Mintなど)のスクリプトは、最初の引数が古い名前を新しい名前に変換するPerl式であるPerlスクリプトです。このスクリプトを使用すると、次のことができます。

rename 's/.*-lib/NORMAL_X-lib/' NORMAL_*-lib*

これsオペレーター実行する正規表現代替。インターネットには、次のような多くの正規表現チュートリアルがあります。1.*-lib最後に表示されるまで文字列を一致させるので-lib.*すべての文字列と一致する)s/.*-lib/NORMAL_X-lib/その部分NORMAL_blahblah-libNORMAL_X-lib

LinuxディストリビューションがDebianから派生していない場合、このrenameユーティリティは実際の作業を実行するのにほとんど適していません。代わりにシェルループを使用できます。

for x in NORMAL_*-lib*; do
  mv "$x" "NORMAL_X-lib${x##*-lib}"
done

${x##*-lib}これは変数の値からx最後の項目を引いたものです-lib。これは標準ですパラメータ拡張通事論。

これはzshで最も簡単です。zmv機能。autoload -U zmv自分のものを入力する.zshrcか、コマンドラインで一度実行してから実行します。

zmv 'NORMAL_*-(lib*)' 'NORMAL_X-$1'

答え4

あなたは使用を検討することができます周りを見てくださいすなわち(?<=NORMAL).*?(?=-lib)

$ rename -v -n -- 's/(?<=NORMAL).*?(?=-lib)/X/' *
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.insertion renamed as NORMALX-lib4.insertion
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.inversion renamed as NORMALX-lib4.inversion
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.translation renamed as NORMALX-lib4.translation

関連情報