9 votes

Suppression d'une partie spécifique du nom de fichier (ce qui se trouve après le deuxième tiret) pour tous les fichiers d'un dossier

J'utilise l'utilitaire de ligne de commande youtube-dl pour télécharger des vidéos de YouTube et en faire des mp3 avec avconv . Je fais cela sous Ubuntu 14.04 et j'en suis très satisfait.

L'utilitaire télécharge les fichiers et les enregistre avec le schéma de noms suivant :

TITLE(artist-track)-ID.mp3

Ainsi, un nom de fichier réel ressemble à :

EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3

D'autres noms de fichiers dans le dossier ressemblent à ceci :

EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3
Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3
Stromae - Papaoutai-oiKj0Z_Xnjc.mp3

Au début, ce n'était pas un problème. Cela ne me dérangeait pas lorsque j'écoutais ma musique dans Rhytmbox. Mais lorsqu'on passe au téléphone ou à d'autres appareils, il est assez déroutant de voir un nom aussi long, et certains lecteurs, comme ceux de Samsung, traitent la dernière partie (l'identifiant après le deuxième tiret) du nom comme un album ou quelque chose comme ça.

J'aimerais créer un bash script qui supprime ce qui se trouve après le deuxième tiret dans le nom de tous les fichiers, de sorte qu'il les rende comme ceci :

Von: Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3

An: Martin Garrix - Animals (Official Video).mp3

Est-il également possible d'instruire youtube-dl pour exclure l'ID à partir de maintenant ?

Je suis en train de télécharger avec la commande :

youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 URL

11voto

steeldriver Points 118154

J'utiliserais le logiciel Perl rename par exemple, pour supprimer la plus courte séquence de caractères de mot commençant par - avant le .mp3 vous pouvez essayer

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

El n exécute la commande en mode "essai" - si les correspondances semblent correctes, supprimez l'option n et l'exécuter à nouveau.

9voto

roadmr Points 32606

La partie que vous ne voulez pas est l'identifiant vidéo. Vous pouvez utiliser la fonctionnalité de modèle de sortie de youtube-dl :

--output "%(title)s"

ceci n'utilisera que le titre et omettra l'identifiant. Exécuter youtube-dl sans paramètres pour voir les autres options.

Vous pouvez réparer vos téléchargements existants :

for i in *; do mv "$i" `basename "$i" .mp3 | cut -f -2 -d "-"`.mp3; done

(Ceci est équivalent à la réponse de Jakke).

6voto

daan Points 11

Sed peut accomplir cela en une seule ligne, bien que de manière assez alambiquée.

ls | sed 's/\(.*\)\(-.*\)/mv \"&\" \"\1.mp3\"/' | bash

Elle liste d'abord les fichiers dans le répertoire courant (en supposant que tous les fichiers que vous voulez renommer sont dans le répertoire courant), puis utilise la commande s/regex/replacement de sed pour générer une commande mv sensée qui est ensuite envoyée à bash qui l'exécute. Cela suppose que tous vos fichiers sont de la forme "A-C.mp3" ou "A - B-C.mp3". Voici comment cela fonctionne :

La partie regex de la commande sed est

\(.*\)\(-.*\)

ceci "regroupe" le nom en deux groupes (délimités par des parenthèses échappées) : un groupe correspondant à ".*". (un nombre quelconque de caractères) et un autre correspondant à "-.*", un tiret suivi d'un nombre quelconque de caractères. Notez que cela correspond au nom de fichier entier (en deux groupes). Notez également que puisque la regex "gourmande" est utilisée, le premier groupe correspondra à "A" dans "A-C.mp3" et à "A - B", et pas seulement à "A ", dans "A - B-C.mp3", comme souhaité.

La partie de remplacement de la commande sed est

mv \"&\" \"\1.mp3\"/

Notez que le caractère & indique à sed d'insérer le motif entier qui correspond à la regex, dans ce cas, il s'agit du nom de fichier entier, et le caractère \1 indique à sed d'insérer la partie du nom de fichier qui correspond au premier groupement ".*". Ces deux éléments sont combinés avec un mv précédent et un .mp3 suivant, avec des guillemets échappés pour produire une commande de renommage sensée. Par exemple, pour "A - B-C.mp3", la commande sed complète produira :

mv "A - B-C.mp3" "A - B.mp3"

Et enfin, tout cela est transmis à bash, qui exécute joyeusement la commande mv (renommer).

3voto

Omer Points 383

Vous pouvez le vérifier avec cette commande :

for i in *.mp3; do echo "$(echo $i|cut -d- -f1,2).mp3"; done

Notez que vous avez des noms de fichiers sans 2 tirets, donc cela ne fonctionnera pas pour tout.

Si vous voulez vraiment changer les noms,

for i in *.mp3
do
  newname="$(echo $i|cut -d- -f1,2).mp3";
  mv $i $newname
done

0voto

nyuszika7h Points 226

Une solution utilisant uniquement le Shell :

filename=foo-bar-baz

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

mv "$filename" "$newname"

Cela fonctionne car le nom du fichier ne se termine pas par un tiret, le dernier jeton est donc ignoré.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X