バッチ名の変更、プレフィックスの変更

バッチ名の変更、プレフィックスの変更

複数のファイルの接頭辞を一括で置き換える方法は?

私は次のような多くのファイルを持っています

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

私はそれらをすべてに変えたい

  • CLConnectionContext.h
  • CLConnectionContext.m

どうすればいいですか?

答え1

rename最も簡単な方法は、多くのLinuxディストリビューションで一般的に使用されるコマンドを使用することです。このコマンドには2つの一般的なバージョンがあるので、そのマニュアルページで使用されているバージョンを確認してください。

## rename from Perl (default in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' TestSR*

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL TestSR*

TestSR*シェルワイルドカードを使用すると、少数のファイル名を渡し、問題が発生するリスクを減らす*ことができます。renameパラメータリストが長すぎます。-エラー、そしてさらに重要なことは、で始まるファイル名が現在の作業ディレクトリに存在するときに発生する問題を回避することです。これはperl、.command.com ベースの特定の亜種にとって特に重要です。renameそうしないと、コマンド注入の脆弱性が発生するためです。

答え2

for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

これは、bashコマンドを使用して入力ファイル名から最初の6文字を削除し、cut結果のCL前に追加した後です$newname。次に、古い名前を新しい名前に置き換えます。これは各ファイルに対して行われます。

cut -c7-インデックス7以降の文字のみが入力から返されることを指定します。7-インデックス 7 から始まり行末までの無限範囲です。

以前は、UTF-8など、文字ごとに複数のバイトを持つことができる文字エンコーディングを処理するために使用していましたが、使用する必要がありましcut -b7-た。-c

答え3

シェルパラメータ拡張このような単純な変換で十分です。コマンド置換は追加のプロセスを作成する必要があるため、効率が低下します(コマンド置換自体およびcut/の場合sed)。

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done

答え4

あなたは試すことができます:

for i in TestSR*; do mv "$i" "${i/#TestSR/CL}"; done

man bash詳細については、(「パラメータ拡張」セクション)を参照してください。

ksh93(この構文の元のソース)とzshでも機能する必要があります。

関連情報