数千のサブディレクトリとファイルを含む数百のフォルダがあります。ファイル名の現在の形式は次のとおりです。
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}
さらに{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)欲しいものを達成するためのスクリプトを書く一つファイル名。次の操作を実行できます。
#! /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 を使用してそのディレクトリを削除する方法がわかります。