Ich verwende das Befehlszeilenprogramm youtube-dl
, um Videos von YouTube herunterzuladen und daraus MP3s zu erstellen avconv
. Ich mache das unter Ubuntu 14.04 und bin sehr zufrieden damit.
Das Dienstprogramm lädt die Dateien herunter und speichert sie unter folgendem Namensschema:
TITLE(artist-track)-ID.mp3
Ein tatsächlicher Dateiname sieht also so aus:
EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3
Einige andere Dateinamen im Ordner sehen folgendermaßen aus:
EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3
Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3
Stromae - Papaoutai-oiKj0Z_Xnjc.mp3
Das war zunächst kein Problem. Es hat mich nicht gestört, meine Musik in Rhytmbox zu hören. Aber wenn Sie zu einem Telefon oder einem anderen Gerät wechseln, ist es ziemlich verwirrend, einen so langen Namen zu sehen, und einige Spieler, wie die von Samsung, behandeln diesen letzten Teil (ID nach dem zweiten Strich) des Namens als Album oder so.
Ich möchte ein Bash-Skript erstellen, das entfernt, was nach dem zweiten Bindestrich im Namen für alle Dateien steht, damit sie wie folgt aussehen:
Von: Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3
Zu: Martin Garrix - Animals (Official Video).mp3
Ist es auch möglich youtube-dl
, die ID von nun an auszuschließen?
Ich lade gerade mit dem Befehl herunter:
youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 URL
bash
Skript bestehen, hilft der Dired-Modus von Emacs (insbesondere die Variante WDired für "Writable Dired"). Siehe hier: gnu.org/software/emacs/manual/html_node/emacs/Wdired.html . In WDired, Sie im Grunde bearbeiten einen Puffer ein enthältls
Ausgang, dannC-c C-c
zu verpflichten , diese Änderungen am Dateisystem. Und Sie können alle Emacs-Goodies verwenden, insbesonderequery-replace
undquery-replace-regexp
. (Und schreiben Sie auch eine kurze Elisp-Hilfsfunktion, um sie zu automatisieren, oder zeichnen Sie ein Tastaturmakro auf und speichern Sie es. Rufen Sie es dann sogar wie einbash
Skript aus der Shell auf !)find
(wie inGNU find
) alle Ihre Dateien können, können Sie sogar die Ersetzungs-Engine ausführen nur einmal!Antworten:
sed kann dies in einer einzigen Zeile erreichen, wenn auch auf ziemlich verworrene Weise.
Dies listet zuerst die Dateien im aktuellen Verzeichnis auf (vorausgesetzt, alle Dateien, die Sie umbenennen möchten, befinden sich im aktuellen Verzeichnis) und generiert dann mit dem Befehl s / regex / replace von sed einen sinnvollen Befehl mv, der dann an bash weitergeleitet wird, der ihn ausführt . Dies setzt voraus, dass alle Ihre Dateien die Form "AC.mp3" oder "A - BC.mp3" haben. So funktioniert es:
Der Regex-Teil des Befehls sed ist
Diese "gruppiert" den Namen in zwei Gruppierungen (getrennt durch Klammern): eine übereinstimmende ". *" (beliebige Anzahl von Zeichen) und eine andere übereinstimmende "-. *", ein Bindestrich, gefolgt von einer beliebigen Anzahl von beliebigen Zeichen. Beachten Sie, dass dies mit dem gesamten Dateinamen übereinstimmt (in zwei Gruppen). Beachten Sie auch, dass die erste Gruppe, da "gieriger" Regex verwendet wird, wie gewünscht mit "A" in "AC.mp3" und "A - B" übereinstimmt, nicht nur mit "A" in "A - BC.mp3".
Der Ersatzteil des Befehls sed ist
Beachten Sie, dass ein & Zeichen sed anweist, das gesamte Muster einzufügen, das mit dem regulären Ausdruck übereinstimmt, in diesem Fall der gesamte Dateiname, und \ 1 sed anweist, den Teil des Dateinamens einzufügen, der der ersten Gruppierung ". *" Entspricht. Diese beiden werden mit einem vorhergehenden mv und einem nachfolgenden .mp3 mit maskierten Anführungszeichen kombiniert, um einen sinnvollen Umbenennungsbefehl zu erzeugen. Für "A - BC.mp3" erzeugt der vollständige sed-Befehl beispielsweise:
Und schließlich wird all dies an bash weitergeleitet, das den Befehl mv (Umbenennen) problemlos ausführt.
quelle
ls
.Ich würde den Perl-basierten
rename
Befehl verwenden - zum Beispiel, um die kürzeste Folge von Wortzeichen zu entfernen, die-
vor dem.mp3
Suffix beginnen, könnten Sie versuchenDie
n
Option führt den Befehl im Trockenlaufmodus aus. Wenn die Übereinstimmungen korrekt angezeigt werden, entfernen Sie dien
Option und führen Sie sie erneut aus.quelle
\.
anstelle von verwenden[.]
.Der Teil, den Sie nicht möchten, ist die Video-ID. Sie können die Ausgabevorlagenfunktion von youtube-dl verwenden:
Dies verwendet nur den Titel und lässt die ID weg. Führen Sie es
youtube-dl
ohne Parameter aus, um andere Optionen anzuzeigen.Sie können Ihre vorhandenen Downloads reparieren:
(Dies entspricht Jakkes Antwort).
quelle
mv -- "$i" "$(basename "$i" .mp3 | cut -f 2 -d "-")".mp3
.Sie können dies mit diesem Befehl überprüfen:
Beachten Sie, dass Sie Dateinamen ohne 2 Bindestriche haben, sodass dies nicht für alle funktioniert.
Wenn Sie die Namen tatsächlich ändern möchten,
quelle
cp
vsmv
in Ihrer Antwort bearbeitenls
.echo
für einfachen Text, es ist nicht portierbar.Eine Lösung, die nur die Shell verwendet:
Dies funktioniert, weil der Dateiname nicht mit einem Bindestrich endet und das letzte Token ignoriert wird.
quelle