web-dev-qa-db-ja.com

フォルダー内のすべてのファイルのファイル名の特定の部分(2番目のダッシュの後)を削除する

コマンドラインユーティリティ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
6
Bodo

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(名前変更)コマンドが喜んで実行されます。

3
icasdri

Perlベースのrenameコマンドを使用します。たとえば、-サフィックスの前にある.mp3で始まる単語文字の最短シーケンスを削除するには、次のようにします。

rename -nv -- 's/-\w+?[.]mp3$/.mp3/' *.mp3

nオプションは、コマンドを「ドライラン」モードで実行します-一致が正しいと思われる場合は、nオプションを削除して、再度実行します。

11
steeldriver

不要な部分はビデオ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の答えと同等です)。

8
roadmr

次のコマンドで確認できます:

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
3
Jakke

シェルのみを使用したソリューション:

filename=foo-bar-baz

while read -rd-; do
    newname="${newname:+$newname-}$REPLY"
done <<< "$filename"

mv "$filename" "$newname"

これは、ファイル名がダッシュで終わらないために機能し、最後のトークンは無視されます。

0
nyuszika7h