web-dev-qa-db-ja.com

一括名前変更、接頭辞の変更

多くのファイルのプレフィックスを一括置換するにはどうすればよいですか?

次のようなファイルがたくさんあります

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

それらをすべてに変更したい

  • CLConnectionContext.h
  • CLConnectionContext.m

どうすればいいですか?

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

これは、bashコマンド置換を使用して、cutを介して入力ファイル名から最初の6文字を削除し、結果の前にCLを付加して、$newnameに格納します。次に、古い名前を新しい名前に変更します。これは、すべてのファイルで実行されます。

cut -c7-は、インデックス7の後の文字のみが入力から返されることを指定します。 7-は、インデックス7から始まり、終わりのない範囲です。つまり、行の終わりまでです。

以前はcut -b7-を使用していましたが、代わりに-cを使用して、UTF-8のように文字ごとに複数のバイトを持つ可能性のある文字エンコーディングを処理する必要があります。

39
mrb

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

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

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

Debianシステムでutil-linux-ngのバージョンを使用する場合は、rename.ulという名前で使用できます。

59
carandraug

シェルパラメータ展開 は、このような単純な変換には十分です。 (コマンド置換自体とcut/sedのために)追加のプロセスを生成する必要があるため、コマンド置換はあまり効率的ではありません。

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

これが1つの方法です。

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m}-> .hまたは.m拡張子を持つすべてのファイルを検索します
  • n=CL->ファイル名にCLプレフィックスを追加します
  • sed -e 's/^Test//'->ファイル名からテスト接頭辞を削除します
  • mv $a $n->名前変更を実行します
4
Eric

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

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

見る man bash(「パラメータの展開」セクション)詳細。

3
Francesco Turco

まあ、それは私ほど難しくはありませんでした。

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;
1
ErikTJ

あなたがもっともっと必要なものがあれば、これを行うことができます

Perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
1
user1146332