11 votes

Renommage en masse, version *nix

Je cherchais un moyen de renommer un grand nombre de fichiers portant le même nom, un peu comme celle-ci (une question liée à Windows) sauf que j'utilise *nix (Ubuntu et FreeBSD, séparément). Pour résumer, tout en utilisant le Shell (Bash, CSH, etc.) comment puis-je renommer en masse un certain nombre de fichiers de sorte que, par exemple, les fichiers suivants :

Beethoven - Fur Elise.mp3
Beethoven - Sonate au clair de lune.mp3
Beethoven - Ode à la joie.mp3
Beethoven - Rage sur le penny perdu.mp3

seront renommées comme celles-ci ?

Fur Elise.mp3
Moonlight Sonata.mp3
Ode à la joie.mp3
Rage Over the Lost Penny.mp3

La raison pour laquelle je veux faire cela est que cette collection de fichiers sera placée sous un répertoire nommé "Beethoven" (c'est-à-dire le préfixe des noms de fichiers), et avoir cette information sur le nom de fichier lui-même sera redondant.

12voto

L'utilitaire de renommage fera ce que vous voulez.

を使うだけです。 rename 's/Beethoven\ -\ //g' *.mp3

10voto

Loïc Wolff Points 14389

Comme beaucoup de choses avec Linux/Unix, il y a plus d'une façon de le faire !

Certains pourraient utiliser mmv (masse mv).

La commande rename, ou prename, qui est fournie avec certains paquets Perl (Ubuntu et Debian plus récents) peut également le faire.

prename 's/Beethoven\ -\ //g' Beethoven*.mp3

Notez que l'outil de renommage sur Fedora 10 n'est pas le même programme que celui-ci et fonctionne différemment. Il fait partie d'un paquetage différent, util-linux-ng, et peut être trouvé à l'adresse suivante ici .

Je me contente souvent d'aller dans le Shell Shell par habitude (après tout de tels outils n'ont pas toujours existé).

mkdir -p Beethoven
for x in Beethoven\ -\ *
do
mv "$x" Beethoven/"${x/Beethoven - /}"
done

Cela créera le répertoire Beethoven, puis déplacera le fichier dans ce répertoire/nom de fichier, où le nom de fichier a le "Beethoven - " remplacé par rien.

Comme un test, avant :

$ ls
Beethoven - Fur Elise.mp3                 Beethoven - Ode to Joy.mp3
Beethoven - Moonlight Sonata.mp3          Beethoven - Rage Over the Lost Penny.mp3

Après :

$ ls Beethoven/
Fur Elise.mp3                 Ode to Joy.mp3
Moonlight Sonata.mp3          Rage Over the Lost Penny.mp3

4voto

Essayez cette solution, mise en œuvre en utilisant une combinaison de grep et rename. Cela suppose que vous avez un grand nombre de répertoires à renommer. S'il n'y en a que quelques-uns, je choisirais l'approche manuelle, avec le motif "Artist - " codé en dur pour chacun.

# Rename any mp3 files in the directory hierarchy of type "a - b.mp3" to "b.mp3"
find . -name "*.mp3" -exec rename -n -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;

Explication de trouver :
Le site trouver trouve tous les fichiers avec .mp3 dans la hiérarchie actuelle des fichiers, et appelle l'argument passé à -exec pour chacun. Notez que dans -exec , {} fait référence à l'argument passé par trouver (chemin+nom du fichier). Le site \; assure la ; est transmis à renommer et au lieu d'indiquer la fin du trouver commandement.

La commande donnée ci-dessus a le -n (aucune action) ; par conséquent, il vous dira seulement ce qui se passerait si vous l'exécutiez. Je vous recommande d'exécuter cette commande sans le commutateur -n seulement après l'avoir exécutée une fois et être satisfait des résultats proposés.

Maintenant pour le regexp.

  • ^ correspond au début de la chaîne.

  • $ correspond à la fin de la chaîne.

  • . correspond à n'importe quel caractère.

  • * signifie zéro ou plus de la construction précédente, par ex. .* signifie zéro ou plusieurs caractères.

  • \s représente un caractère d'espace quelconque.

  • \S représente tout caractère autre qu'un espace.

  • Tout ce qui se trouve dans () est capturée et se traduit par $1 , $2 en fonction de sa position.

Le regexp :

  • Cherche une structure de répertoire optionnelle au début, la saisit dans $1 : (.*/)
  • Il saute tout jusqu'au " - " : .*-
  • Capture le reste de la chaîne, à l'exception des espaces de début et de fin, dans $2 : (.*)
  • Réécrit le fichier sous la forme $1$2, qui devrait être "/path/to/file/" "filename.mp3".

Voici mon essai :

/tmp/test$ ls -R
.:
a  b  c  z-unknown.mp3

./a:
a3.mp3                 a - longer title3.mp3  c.mp3   disc2
a - longer title2.mp3  a - long title.mp3     disc 1  the band - the title.mp3

./a/disc 1:
a - title1.mp3  a - title2.mp3

./a/disc2:
a - title1.mp3  a - title2.mp3

./b:
cd - ab - title3.mp3  cd - title1.mp3  cd - title2.mp3  c.mp3

./c:
c-pony2.mp4  c - pony3.mp3  c - pony4.mp3  c-pony.mp3

/tmp/test$ find . -name "*.mp3" -exec rename -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;
./c/c-pony.mp3 renamed as ./c/pony.mp3
./c/c - pony4.mp3 renamed as ./c/pony4.mp3
./c/c - pony3.mp3 renamed as ./c/pony3.mp3
./z-unknown.mp3 renamed as ./unknown.mp3
./a/the band - the title.mp3 renamed as ./a/the title.mp3
./a/a - longer title2.mp3 renamed as ./a/longer title2.mp3
./a/a - longer title3.mp3 renamed as ./a/longer title3.mp3
./a/disc 1/a - title1.mp3 renamed as ./a/disc 1/title1.mp3
./a/disc 1/a - title2.mp3 renamed as ./a/disc 1/title2.mp3
./a/a - long title.mp3 renamed as ./a/long title.mp3
./a/disc2/a - title1.mp3 renamed as ./a/disc2/title1.mp3
./a/disc2/a - title2.mp3 renamed as ./a/disc2/title2.mp3
./b/cd - title1.mp3 renamed as ./b/title1.mp3
./b/cd - title2.mp3 renamed as ./b/title2.mp3
./b/cd - ab - title3.mp3 renamed as ./b/title3.mp3

/tmp/test$ ls -R
.:
a  b  c  unknown.mp3

./a:
a3.mp3  c.mp3  disc 1  disc2  longer title2.mp3  longer title3.mp3  long title.mp3  the title.mp3

./a/disc 1:
title1.mp3  title2.mp3

./a/disc2:
title1.mp3  title2.mp3

./b:
c.mp3  title1.mp3  title2.mp3  title3.mp3

./c:
c-pony2.mp4  pony3.mp3  pony4.mp3  pony.mp3

Les Regexp sont une affaire délicate, et j'ai fait beaucoup de gaffes en les écrivant, donc j'aimerais avoir des commentaires sur le manque de mérite de celle-ci. Je sais que j'en ai trouvé pas mal en la testant.

1voto

Louis Haußknecht Points 135

J'ai mis au point un programme Java en ligne de commande qui permet de renommer des fichiers (et des répertoires) en un tournemain, notamment pour les scripts. Il est gratuit et open source, vous pouvez donc le modifier à votre guise :

RenameWand
http://renamewand.sourceforge.net/

Quelques exemples d'utilisation pertinents :

Déplacer des fichiers de la forme "<a> - <b>" dans leur répertoire respectif "<a>" :

java -jar RenameWand.jar  "<a> - <b>"  "<a>/<b>"

Trier les fichiers par date de dernière modification et les renommer avec un numéro à 3 chiffres :

java -jar RenameWand.jar  "<a>"  "<3|#FT> <a>"

Réorganiser les parties du nom de fichier, et changer la casse :

java -jar RenameWand.jar  "<album> - <artist> - <song>.<ext>" 
                          "<artist.upper> <album.title> - <song>.<ext.lower>"

1voto

ocodo Points 1744

zmv L'outil de renommage de zsh est très bon.

# zmv "programmable rename"
# Replace spaces in filenames with a underline
zmv '* *' '$f:gs/ /_'
# Change the suffix from *.sh to *.pl
zmv -W '*.sh' '*.pl'
# lowercase/uppercase all files/directories
$ zmv '(*)' '${(L)1}' # lowercase
$ zmv '(*)' '${(U)1}' # uppercase

Plus de notes ici...

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