web-dev-qa-db-ja.com

ディレクトリの名前を変更して、年を最後から最初に移動する

現在、いくつかの音楽フォルダに苦労しています。 artist - album - yearというパターンに従って名前を付けることにしました。今日、これは巧妙な動きではないことに気付いたので、次のパターンに従ってディレクトリに名前を付けたいと考えています:year - artist - album

手作業で名前の変更を開始しましたが、約700個のフォルダーがあるため、より簡単な方法が必要です。 gprenameを使用してみましたが、正規表現とbashスクリプトがあまり得意ではありません...

私の悪い指先をspareしみなく手伝ってくれる人はいますか?

いくつかの例:

Aes Dana - Memory Shell - 2004 
Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009

になるだろう

2004 - Aes Dana - Memory Shell
2009 - Anja Schneider & GummiHz - Back To Back (Remixes Part 2)

編集:アーティスト名とアルバム名には、And.IdKool & The Gangなどの特殊文字が含まれているものがあります。すべてのディレクトリには、セパレータとして-がありますが。

11
TazMayhem

Perl rename(一般にUbuntuで利用可能-違いを明確にする@Sergに感謝します。疑わしい場合は/usr/bin/renameを呼び出して、正しいものを取得する必要があります)を使用すると仮定します。

rename -n 's/(.*) - (\d{4})\//$2 - $1/' */

実際にディレクトリの名前を変更するには、テスト後に-nを削除します。これは、すべてのアルバムの日付が1000〜9999であることを前提としています。おそらく合理的です...

説明

  • s/old/newoldnewに置き換えます
  • (.*)は、後で$1として参照するために任意の数の文字を保存します
  • (\d{4})\/は、行末に4桁を保存して、後で$2として参照します。
  • */はすべてのディレクトリに一致します(ファイルではありません-@muruに感謝します!)
16
Zanna

シンプルなPythonスクリプトはそのような仕事をすることができます:

$ tree
.
├── Aes Dana - Memory Shell - 2004
├── Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
└── rename_dirs.py

2 directories, 1 file
$ ./rename_dirs.py */
$ tree
.
├── 2004 - Aes Dana  -  Memory Shell 
├── 2009 - Anja Schneider & GummiHz  -  Back To Back (Remixes Part 2) 
└── rename_dirs.py

スクリプトの内容:

#!/usr/bin/env python
from shutil import move;
import sys

for i in sys.argv[1:] :
    parts = i[:-1].split('-')
    year = parts[-1].strip()
    new_name = year + " - " + " - ".join(parts[:-1]).strip()
    move(i,new_name)

仕組み:

  • 主なトリックは、ターゲットが存在する同じディレクトリからスクリプトを実行することです。また、*/を渡して、ディレクトリをスクリプトの引数としてのみ提供します。
  • このスクリプトは、すべてのコマンドライン引数を反復処理し、各ファイル名を-文字の文字列のリストに分解します。新しいファイル名は、抽出した部分から構成されます。
  • shutilsモジュールのmove()関数は、実際にディレクトリの名前を変更するものです

使用法に注意してください:./rename_dirs.py */

6