12 votes

Comment supprimer les caractères de queue dans les noms de fichiers en Bash ?

J'ai un tas de fichiers multimédia comme ceux ci-dessous :

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

Je voudrais les renommer en

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

J'ai essayé d'utiliser rename mais, de toute évidence, la syntaxe n'est pas correcte car l'opération échoue.

14voto

Crazyaussie21 Points 11

Dans Shell, on pourrait faire simplement :

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

Le Shell peut produire une liste des noms de fichiers avec juste un glob régulier, et ${var%pattern} supprime le motif correspondant (le plus court) de la fin de la chaîne dans la variable var . Puisque l'extension finale est toujours .avi j'ai juste enlevé le motif et je l'ai rajouté. Avec les guillemets, cela devrait également fonctionner avec les noms de fichiers contenant des espaces, par exemple Fancy Name for a Show.s01e01]Asdf.avi

9voto

James Nuanez Points 426

Cela renommera les fichiers. Vous avez besoin du \w * pour signifier un nombre quelconque de caractères alphanumériques.

rename 's/\]\w*//' *

Référence : http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#UsingSimpleWildcards

2voto

Ben N Points 38070

Ce n'est pas très pratique - les autres réponses sont beaucoup plus rapides et courtes - mais...

Vous pouvez utiliser PowerShell ! Microsoft l'ouvrir récemment et l'a rendu multiplateforme. Pour les téléchargements et les instructions d'installation pour votre système d'exploitation, voir la section "Obtenir PowerShell .

Une fois que vous l'aurez installé, vous pourrez utiliser ce bref script :

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

En gros, il passe en revue chaque objet du répertoire actuel qui est un fichier correspondant à l'une des catégories suivantes *]*.avi , prend la partie avant le support, cloue .avi sur elle, et l'assigne comme nouveau nom.

Pour l'exécuter directement depuis Bash, utilisez cette phrase semi-golfique :

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

La citation est une courtoisie de cette réponse de Stack Overflow .

(Testé dans Bash sur Ubuntu sous Windows. Il y a probablement un moyen beaucoup plus court de le faire avec PowerShell, mais je voulais montrer quelque chose qui soit compréhensible pour les personnes qui ne connaissent pas les expressions régulières).

1voto

MvG Points 1419

Debian a un paquet appelé mmv qui pourrait aussi être disponible dans d'autres distros, et devrait être assez facile à compiler à partir des sources si ce n'est pas le cas. Il vous permet d'écrire ceci :

mmv '*]*.avi' '#1.avi'

Vous pouvez lire le Page de manuel Ubuntu pour cette commande pour plus de détails.

0voto

Tejender Mohan Points 1

Ceci va rechercher le motif et remplacer le texte en utilisant sed.

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename

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