ファイル名を修正するBashスクリプト

ファイル名を修正するBashスクリプト

何千ものサブディレクトリとファイルを含む何百ものフォルダがあります。ファイル名は現在、次の形式になっています。

sf{number}-{number} - {text}

{text} まですべて削除する必要があります。

例:

sf012-05 - toto - africa.cdg 
sf012-05 - toto - africa.mp3

->

toto - africa.cdg
toto - africa.mp3

追加のフォーマット:

SF-108 - 02 Johnny Hates Jazz Shattered Dreams[K].cdg
02 - David Essex - Rock On.cdg
SF0504 - 13 Walker Brothers, The  Make It Easy On Yourself.cdg
SFLY 051 - 07 America  A Horse With No Name.cdg
SF217-12 this love - maroon 5.cdg
SF262-13. Same Mistake - James Blunt.cdg
SF287 - 13 Luke Bryan Do I.cdg
SF355-01-15 - Tough Love - Pony.cdg
Track 11 Livin' La Vida Loca (Radio Edit) - Martin, Ricky.cdg
Sunfly Hits 275 - 07 SF275-7-Right Now (Na Na Na)-Akon.mp3
Second, Minute Or Hour - Jack Penate.mp3
SF057 - Karaoke Classics Vol.57 - 03 Abba Thank You For The Music.cdg

特に最後のものは全くのゴミだ。

つまり、これらのファイルを調べて名前を変更するには、再帰的な正規表現の bash スクリプトまたは同様のものが必要になります。

答え1

Perl ベースのrenameユーティリティ (prename一部のディストリビューションで呼び出されます) をお持ちの場合は、正規表現を使用して一度にすべてのファイルの名前を変更できます。

要件では を削除するように要求されていますsf{number}-{number}が、例はすべて大文字で始まっており、{number}{number}-{number}-{number}、または が1 つしか{number}{space}-{space}{number}含まれていないものもあります。これらのケースのうち最初の 2 つを含めることを想定します。

rename -n 's/^sf[0-9-]+\s+(-\s+)?//' [Ss][Ff]*

-n変更を適用する準備ができたらを削除するか、 を変更して、-vファイルが処理される様子を確認します。

答え2

ここで最も簡単なツールは翻訳(bashに似ているが、より優れている)ファンシーグロビングそしてそのzmv関数ファイル名を変更する最上位ディレクトリからこれを実行します。

autoload -U zmv
zmv '(**/)[Ss][Ff][0-9]##-[0-9]##[- ]#(*)' '$1$2'

説明:は、**/先頭のディレクトリの任意の文字列です。次に、sf(大文字と小文字を区別しない) のパターンがあり、その後に 1 つ以上の数字、ダッシュ、別の数字、ダッシュとスペースが続きます。最後に、任意のサフィックスが付く場合があります*。置換内の数字は、パターン内の括弧で囲まれたグループを参照します。


あるいは、 を使用することもできますprename(Debian および Arch Linux で利用可能な Perl ベースの名前変更スクリプトは、他のディストリビューションでは別途インストールする必要がある場合があります)。find名前を変更するファイルのリストを収集するには、 と組み合わせる必要があります。 に一致しないファイルが渡されても問題ありません。rename名前を変更する必要がないファイルはスキップされます。

find -name '[Ss][Ff]*' -exec prename 's!/!sf[0-9]+-[0-9]+[- ]*!!i' {} +

答え3

コードは次のとおりです (ディレクトリをメイン ディレクトリ、またはサブディレクトリがある場所に置き換えます)。

cd directory
find -type f | while IFS= read - file; do 
    name=$(echo "$file"  | rev | cut -d'/' -f1 | rev |  cut -d'-' -f3- | cut -d' ' -f2-) 
    path=$(dirname "$file")  
    newname="${path}/${name}"
    echo mv "$file" "$newname" 
done

ここで、ディレクトリはすべてのサブディレクトリが存在するメイン ディレクトリです。

「mv」から「echo」を削除しないで、まずテストしてください。

間違ったディレクトリで実行しないように注意してください。非常に危険です。

答え4

あなたは言う{text} まですべて削除する必要がありますしかし、あなたの例ではそれが示されていません。正確なコードを示すのではなく、計画を提案させてください。

1) 必要なことを実行するスクリプトを書く1つファイル名。次のような感じになります:

#! /bin/sh
test -d ~/OK/${PWD} || mkdir -p ~/OK/${PWD}
ln "$1" "~/OK/${PWD}/$1"
echo "$1" | awk -F ' - ' '{print $NF}'

これにより、パターン ' - ' で名前が分割され、最後のフィールドが出力されます。また、何か問題が発生した場合に取得できるように、元のファイル名が保存されます。これを数回テストし、 を使用してmv名前を復元します。

2) スクリプトを呼び出す探す:

$ find dirname -exec script.awk {} +

こうすると、スクリプトが多数同時に呼び出され、マシンがいっぱいになります。完了すると、削除できるディレクトリが多数残り、find を使用してそれらを削除する方法がわかります。

関連情報