ファイル名から接頭辞を削除する


10

次のようなファイルがたくさんあります。

04602635_b0294.DAT20120807164534
04602637_b0297.DAT20120807164713
04602638_b0296.DAT20120807164637
04602639_b0299.DAT20120807164819
04602640_b0298.DAT20120807164748
04602641_b0300.DAT20120807164849
04602650_b0301.DAT20120807164921
04602652_b0302.DAT20120807164956

プレフィックスを除外するには、名前を変更する必要があります。このように見える必要があります。

b0294.DAT20120807164534
b0297.DAT20120807164713
b0296.DAT20120807164637
b0299.DAT20120807164819
b0298.DAT20120807164748
b0300.DAT20120807164849
b0301.DAT20120807164921
b0302.DAT20120807164956

編集

Solarisを使用していることを忘れてしまいました。

回答:


19
for file in * ; do
    echo mv -v "$file" "${file#*_}"
done

これを実行して、すべてが正常であることを確認します。
ある場合は、echoコマンドから削除すると、必要に応じてファイルの名前が変更されます。

"${file#*_}"

シェルの通常の置換機能です。最初の_シンボル(シンボル自体を含む)の前のすべての文字を削除します。より多くの詳細が見てここに


何が起こっているのか正確に説明していただけます"${file#*_}"か?
Pieter van Niekerk 2012

回答に説明を追加しました。
ラッシュ

IMO、ほとんどすべてのスクリプトは、目的のコマンド出力をエコーするように作成する必要があります。ただし、を削除せずにecho、スクリプト出力をにパイプするだけbashです。
ジムL.

7

このためのツールrenameを使用できます。

rename "s/.*_//" *

追加-nした場合、名前は変更されず、なしで何が行われたかが表示され-nます。

ラッシュのコメントへの応答:私renameは実際にはprename、DebianとUbuntuのperlパッケージに同梱されているリンクです。


5
rename異なるシステムでも常に同じであるとは限らず、構文が異なる場合があることに注意してください。
ラッシュ

1
質問者は、彼がSolarisを使用していることを追加しました。そのため、この名前変更コマンド(Debianおよび派生物に固有)は彼には使用できません。
Gilles「SO-悪をやめ

1
...彼がソースからそれを構築することに成功した場合を除きます。
sendmoreinfo 2013年

@Gilles perl-renameはDebianに固有のものではありません。それは単に呼び出されていないですrenameが、perl-renameまたはprename他のディストリビューションで。ただし、常にリポジトリ内にある必要があり、1つはperlでもインストールされます。
terdon

@terdon 基本的な使用法がperl式あるファイルの名前を変更するコマンドは、 Debianに固有のものではありません。そのようなコマンドは、呼び出されrename、単に呼び出されないパッケージを明示的に要求せずにインストールされる可能性が高いためrename、Debianに固有です。他のLinuxディストリビューションはコマンドを呼び出すprenameperl-rename、util-linux renameとの混乱を避けるために、perlパッケージにバンドルしていません。また、その名前で出荷されるLinux以外のUNIX renameや、任意の名前でのデフォルトのインストール。
Gilles「SO-邪悪なことをやめなさい」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.