コマンドラインユーティリティyoutube-dl
を使用してYouTubeからビデオをダウンロードし、avconv
を使用してそれらからmp3を作成します。私はこれをUbuntu 14.04で実行していますが、非常に満足しています。
ユーティリティはファイルをダウンロードし、次の名前スキームで保存します。
TITLE(artist-track)-ID.mp3
したがって、実際のファイル名は次のようになります。
EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3
フォルダー内の他のファイル名は次のようになります。
EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3
Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3
Stromae - Papaoutai-oiKj0Z_Xnjc.mp3
最初は、これは問題ありませんでした。 Rhytmboxで自分の音楽を聴いている間は気にしませんでした。しかし、電話や他のデバイスに移動するとき、非常に長い名前を見るのはかなり混乱し、サムスンのような一部のプレーヤーは、名前の最後の部分(2番目のダッシュの後のID)をアルバムまたは何かとして扱います。
すべてのファイルの名前の2番目のダッシュの後にあるものを削除するbashスクリプトを作成したいので、次のようにします。
From:Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3
宛先:Martin Garrix - Animals (Official Video).mp3
これからIDを除外するようyoutube-dl
に指示することもできますか?
私は現在、次のコマンドでダウンロードしています:
youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 URL
sedは、かなり複雑な方法ではありますが、これを1行で実現できます。
ls | sed 's/\(.*\)\(-.*\)/mv \"&\" \"\1.mp3\"/' | bash
これは最初に現在のディレクトリ内のファイルをリストし(名前を変更するすべてのファイルが現在のディレクトリにあると仮定)、次にsedのs/regex/replacementコマンドを使用して賢明なmvコマンドを生成し、それをbashにパイプして実行します。これは、すべてのファイルが「A-C.mp3」または「A-B-C.mp3」の形式であることを前提としています。仕組みは次のとおりです。
Sedコマンドの正規表現部分は
\(.*\)\(-.*\)
これは、名前を「エスケープされた括弧で区切られた」2つのグループに「グループ化」します。1つは「。*」に一致し、もう1つは「-。*」に一致します。これはファイル名全体(2つのグループ)に一致することに注意してください。また、「greedy」正規表現が使用されるため、最初のグループは「A-B-C.mp3」の「A」だけでなく、「A-C.mp3」および「A-B」の「A」に一致することに注意してください。
Sedコマンドの置換部分は
mv \"&\" \"\1.mp3\"/
&文字はsedに正規表現に一致するパターン全体(この場合はファイル名全体)を挿入するよう指示し、\ 1はsedに最初のグループ "。*"に一致するファイル名の部分を挿入するよう指示します。これら2つは、先行するmvと末尾の.mp3、およびエスケープされた引用符と組み合わされて、適切な名前変更コマンドを生成します。たとえば、「A-B-C.mp3」の場合、完全なsedコマンドは以下を生成します。
mv "A - B-C.mp3" "A - B.mp3"
そして最後に、これらすべてがbashにパイプされ、mash(名前変更)コマンドが喜んで実行されます。
Perlベースのrename
コマンドを使用します。たとえば、-
サフィックスの前にある.mp3
で始まる単語文字の最短シーケンスを削除するには、次のようにします。
rename -nv -- 's/-\w+?[.]mp3$/.mp3/' *.mp3
n
オプションは、コマンドを「ドライラン」モードで実行します-一致が正しいと思われる場合は、n
オプションを削除して、再度実行します。
不要な部分はビデオIDです。 youtube-dlの出力テンプレート機能を使用できます。
--output "%(title)s"
これはタイトルのみを使用し、IDを省略します。パラメーターなしでyoutube-dl
を実行して、他のオプションを表示します。
既存のダウンロードを修正できます:
for i in *; do mv "$i" `basename "$i" .mp3 | cut -f -2 -d "-"`.mp3; done
(これはJakkeの答えと同等です)。
次のコマンドで確認できます:
for i in *.mp3; do echo "$(echo $i|cut -d- -f1,2).mp3"; done
2つのダッシュのないファイル名を持っているので、すべてに対して機能しないことに注意してください。
実際に名前を変更したい場合は、
for i in *.mp3
do
newname="$(echo $i|cut -d- -f1,2).mp3";
mv $i $newname
done
シェルのみを使用したソリューション:
filename=foo-bar-baz
while read -rd-; do
newname="${newname:+$newname-}$REPLY"
done <<< "$filename"
mv "$filename" "$newname"
これは、ファイル名がダッシュで終わらないために機能し、最後のトークンは無視されます。