多くのファイルのプレフィックスを一括置換するにはどうすればよいですか?
次のようなファイルがたくさんあります
それらをすべてに変更したい
どうすればいいですか?
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のように文字ごとに複数のバイトを持つ可能性のある文字エンコーディングを処理する必要があります。
多くの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
という名前で使用できます。
シェルパラメータ展開 は、このような単純な変換には十分です。 (コマンド置換自体とcut
/sed
のために)追加のプロセスを生成する必要があるため、コマンド置換はあまり効率的ではありません。
for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
これが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
->名前変更を実行しますあなたは試すことができます:
for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done
見る man bash
(「パラメータの展開」セクション)詳細。
まあ、それは私ほど難しくはありませんでした。
$ 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;
あなたがもっともっと必要なものがあれば、これを行うことができます
Perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *