複数のファイルの接頭辞を一括で置き換える方法は?
私は次のような多くのファイルを持っています
- 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でも機能する必要があります。