1行のコマンドでファイル名を変更する


10

このディレクトリがあり、ファイルの名前を変更したい:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

結果は次のようになります。

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

一般的なシェルツールでこれを解決したいと思います。


1
一般的なシェルツールでこれを解決したいと思います。正当な理由がないと言っているわけではありませんが、「なぜ?」と自分自身に質問して答えたと思います。前回、非常によく似た問題を解決する必要がありましたが、すぐにBashを片側に押し込んでPythonで解決しました。はるかに簡単です(ただし、Python、文字列メソッド、glob.glob、os.renameはすでに知っていました-また、スペースやその他の厄介な文字が含まれるフォルダ名でいっぱいのツリーを再帰的に検索する必要がありましたが、どれも余分な原因ではありません)はPythonを使用している場合わざわざ
nigel222

1
@ nigel222私は怠惰で、できるだけ少ない文字を入力したいです。ここでpythonを使いたくないのはそのためです。誤解しないでください。これまでのところ、Pythonは私の好きなプログラミング言語であり、毎日使用しています。
guettli 2017年

回答:


18

あなたは使うことができますrename...

rename -n 's/^[0-9]+ - //' *

-nテスト後に削除して、実際にファイルの名前を変更します

説明

  • s/old/new/置き換えるoldnew
  • ^ 文字列の始まり
  • [0-9]+ いくつかの数字

renameツールでサポートされている正規表現の花の種類。PCREを使用していますか?... 素晴らしいことだ。
guettli 2017年

5
@guettli厳密に言えば、それはPCREではありません(Perl 互換の正規表現です)。renameそれは完全なPerlの正規表現をサポートしているので、Perlスクリプトです。PCREはそのサブセットにすぎません。ただし、PCREから知っていることはすべてに適用されrenameます。
terdon 2017年

@terdon実装は気にしません。あなたが数学のメガネでそれを見れば、renameperl互換の正規表現があります。はい、pcre実装は使用されません。私はこれを理解しました:-)あなたの速い返事をありがとう。
guettli 2017年

9

bash 最初から必要な部分を取り除くためのパラメーター拡張:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

展開されたフォーム:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echoドライランニング用です。実際のアクションのためにそれを取り除く:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

例:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg

はい、動作します。ありがとうございました。私はPythonからのperl互換の正規表現(毎日使用しています)を知っているので、このrenameコマンドを使用します。(タイピングが少なくて済みます)。
guettli 2017年

1
renamePCREに精通している場合は、@ guettli を使用してください。rename答えはまだ与えられた純粋で移動する必要がありましたbash。ただし、pythonre(またはregex)モジュールはPCREと完全に互換性があるわけではありません。
heemayl 2017年

@guettliまた、私の回答に反対票を投じただけですか?:O
heemayl 2017年

はい、そうしました。あなたのコメントに賛成しました。個人的に取らないでください。私を誤解しないでください、しかし私の個人的な意見はこれ${f#[[:digit:]]*-[[:blank:]]}は醜いということです。はい、動作します。しかし、私たちは21世紀に住んでいます。「うまくいく」から「簡単で楽しい」に切り替える時がきたと思います。「うまくいく」が目標であれば、Linuxはユーザーフレンドリーではないという偏見を失うことはありません。あなたはすでに多くの賛成票を獲得しているので、この1つの反対票は傷つかないはずです(私はそう思います)。もしそうなら、私に教えてください、そして私はそれを取り戻します。
guettli 2017年

1
@guettli何にでも似合う。ここに:gnu.org/software/bash/manual/html_node/…注意してください、文字クラス[[:digit:]][[:blank:]]あなたのに準拠するためにそこにあったlocale、これらはRegexでもかなり一般的です。
heemayl 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.