一括名前変更、プレフィックスの変更


53

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

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

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

すべてを変更したい

  • CLConnectionContext.h
  • CLConnectionContext.m

どうすればいいですか?

回答:


38
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から始まり、終わりのない範囲です。つまり、行末まで。

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


THX、私は今自分でこれを手に入れました。回答としてマーク。Thx
ErikTJ

これはうまく機能します、ありがとう。-b7-の機能を説明できますか?これはバイトリストへの参照ですか?ss64.com/bash/cut.html
13

@imjared回答をより詳細に更新しました。
Mrb

56

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

## 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


7
警告:複数のバージョンがrename存在します。rename使用方法については、ローカルのドキュメントを確認してください。
jw013

エイリアスを削除するために行うrename TestSR '' *
Bsienn

うーん...- rename "\<pre\>" "" *>Unterminated <> operator at (user-supplied code).
Flash Thunder

32

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

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

説明:TestSR*ファイルを検出しCL${f#TestSR}、新しい名前になります。後のもの#は、ファイル名(f)から置換されます。
ジョーエイフェルト

4

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 ->名前変更を実行します

3

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

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

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


1

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

$ 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
将来に役立つ場合は、2つのパターンに対してコマンドを繰り返す必要はありません。あなたは(たとえば)を使用することができます:for f in TestSR*.[mh]for f in TestSR*.{m,h}for f in TestSR*.m TestSR*.h
Mrb

1

もっと完璧なものが必要な場合は、これを行うことができます

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.