web-dev-qa-db-ja.com

Unixの単一のコマンドまたはスクリプトで複数のファイルの名前を変更する方法は?

以下のファイルリストがあります

aro_tty-mIF-45875564pmo_opt
aro_tty-mIF-45875664pmo_opt
aro_tty-mIF-45875964pmo_opt
aro_tty-mIF-45875514pmo_opt
aro_tty-mIF-45875524pmo_opt

名前を変更する必要があること

aro_tty-mImpFRA-45875564pmo_opt
aro_tty-mImpFRA-45875664pmo_opt
aro_tty-mImpFRA-45875964pmo_opt
aro_tty-mImpFRA-45875514pmo_opt
aro_tty-mImpFRA-45875524pmo_opt
62
Udhayakumar

ほとんどの標準シェルは、シェル変数内で単純なテキスト置換を行う方法を提供します。 http://tldp.org/LDP/abs/html/parameter-substitution.html は次のように説明します:

${var/Pattern/Replacement}

First match of Pattern, within var replaced with Replacement.

したがって、次のスクリプトを使用して、適切なすべてのファイルをループし、それぞれの名前を変更します。

for file in aro_tty-mIF-*_opt
do
    mv -i "${file}" "${file/-mIF-/-mImpFRA-}"
done

-iオプションを追加したので、名前の変更操作を確認できます。いつものように、大量の名前変更や削除を行う前に、すべてのファイルのバックアップを作成する必要があります。

79
Mark Plotnick

Perlのrenameがない場合:

Perl -e '
FILE:for $file (@ARGV){
        ($new_name = $file) =~ s/-mIF-/-mImpFRA-/
        next FILE if -e $new_name;
        rename $file => $new_name
}' *_opt

あなたがdo Perlのrenameを持っている場合:

rename 's/-mIF-/-mImpFRA-/' *_opt
20
Joseph R.

次のような複雑なコマンドを試す前に、ファイルのバックアップを実行してください。タイプミス(自分または自分のもの)が何を引き起こす可能性があるかは、決してわかりません。

mv(コメントで尋ねたように--- renameは他の回答で提案されているように、おそらくファイル名にスペースや奇妙な文字が含まれている可能性がある場合はおそらく)より安全です。

for f in *_opt; do
    a="$(echo $f | sed s/-mIF-/-mImpFRA-/)"
    mv "$f" "$a"
done
17
Rmano