回答:
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/) }' *