回答:
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のように、文字ごとに複数バイトを持つ可能性がある文字エンコードを処理するために使用する必要があります。
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
rename存在します。rename使用方法については、ローカルのドキュメントを確認してください。
rename TestSR '' *
rename "\<pre\>" "" *>Unterminated <> operator at (user-supplied code).
このような単純な変換には、シェルパラメーターの展開で十分です。(コマンド置換自体とcut/のためにsed)追加のプロセスを生成する必要があるため、コマンド置換の効率は低下します。
for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
TestSR*ファイルを検出しCL${f#TestSR}、新しい名前になります。後のもの#は、ファイル名(f)から置換されます。
あなたは試すことができます:
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;
for f in TestSR*.[mh]、for f in TestSR*.{m,h}、for f in TestSR*.m TestSR*.h。
もっと完璧なものが必要な場合は、これを行うことができます
perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *