Je cherchais un moyen de renommer un grand nombre de fichiers portant le même nom, un peu comme celui-ci (une question liée à Windows), sauf que j'utilise * nix (Ubuntu et FreeBSD, séparément). Pour résumer, en utilisant le shell (Bash, CSH, etc.), comment renommer en masse un certain nombre de fichiers tels que, par exemple, les fichiers suivants:
Beethoven - Fourrure Elise.mp3
Beethoven - Sonate au clair de lune.mp3
Beethoven - Ode à la joie.mp3
Beethoven - Rage Over the Lost Penny.mp3
sera renommé comme ça?
Fur Elise.mp3
Moonlight Sonata.mp3
Ode to Joy.mp3
Rage Over the Lost Penny.mp3
La raison pour laquelle je veux le faire est que cette collection de fichiers ira dans un répertoire nommé "Beethoven" (c'est-à-dire le préfixe des noms de fichiers), et avoir ces informations sur le nom de fichier lui-même sera redondant.
Comme tant 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 fournie avec certains packages Perl (Ubuntu et Debian plus récents) peut également le faire.
Notez que l'outil de changement de nom sur Fedora 10 n'est pas le même programme que celui-ci et fonctionne différemment. Il fait partie d'un package différent, util-linux-ng et peut être trouvé ici .
Je vais souvent dans le shell pour une boucle par habitude (après que tous ces outils n'existent pas toujours).
Cela va créer le répertoire Beethoven, puis déplacer le fichier vers ce répertoire / nom de fichier, où le nom de fichier a le "Beethoven -" remplacé par rien.
Comme test, avant:
Après:
la source
Essayez cette solution, implémentée à l'aide d'une combinaison de grep et rename. Cela suppose que vous avez tout un tas de répertoires que vous devez renommer. S'il n'y en a que quelques-uns, j'opterais pour l'approche manuelle, avec le modèle "Artiste -" codé en dur pour chacun.
Explication de find :
la commande find recherche tous les fichiers avec l' extension .mp3 dans la hiérarchie de fichiers actuelle et appelle l'argument passé à -exec pour chacun. Notez que dans -exec , {} fait référence à l'argument passé par find (chemin de fichier + nom). Le
\;
assure que le;
passe est renommé et au lieu d'indiquer la fin de la commande find .La commande donnée ci-dessus a le commutateur -n (aucune action); par conséquent, il ne vous dira que ce qui se passerait si vous l'exécutiez. Je vous recommande d'exécuter cette commande sans le commutateur -n uniquement après l'avoir exécutée une fois et satisfait des résultats proposés.
Maintenant pour l'expression rationnelle.
^
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 exemple.*
signifie zéro ou plusieurs caractères.\s
représente tout caractère spatial.\S
représente tout caractère non spatial.()
est capturé et se reflète aussi$1
,$2
en fonction de sa position.L'expression régulière:
(.*/)
-
":.*-
(.*)
Voici mon test:
Les regexp sont des affaires délicates, et j'ai fait beaucoup d'erreurs en les écrivant, donc je serais ravi de toute contribution sur le manque de mérite de celui-ci. Je sais que j'ai trouvé pas mal de tests.
la source
J'ai mis au point un programme Java en ligne de commande qui facilite le changement de nom des fichiers (et répertoires), en particulier pour les scripts. C'est gratuit et open source, vous pouvez donc le modifier selon le contenu de votre cœur:
RenameWand
http://renamewand.sourceforge.net/
Quelques exemples d'utilisation pertinents:
Déplacez les fichiers du formulaire
"<a> - <b>"
vers leur répertoire respectif"<a>"
:Triez les fichiers par heure de dernière modification et renommez-les avec un nombre à 3 chiffres:
Réorganisez les parties du nom de fichier et changez la casse:
la source
zmv
L'outil de renommage zsh est très bon.Plus de notes ici ...
la source
Pour les têtes de pingouin, cela se fait facilement dans un script shell ou un script AWK. Pour nous, simples mortels, vous voudrez peut-être essayer Midnight Commander. C'est sur la plupart des distributions Linux, à partir d'une invite de shell de type mc -a. Vous pouvez renommer des fichiers à l'aide d'expressions régulières. J'ai utilisé l'article sur GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/ pour m'aider.
la source
Voici un exemple simple en ligne de commande. J'avais le mot «blanc» au milieu des noms d'un tas de fichiers png. Je voulais le retirer et ne laisser qu'un seul trait de soulignement. Cela a fait l'affaire:
la source
Utilisez vidir , puis utilisez les fonctionnalités de votre éditeur pour appliquer le modèle de changement de nom.
la source
Sur un * nix sans perl
rename
disponibleSur certains * nix, il n'y a pas de renommage disponible, il est donc nécessaire de le renommer en utilisant une autre méthode. Il y a quelques années, j'ai suggéré
zmv
ici qui, bien que génial, n'est pas nécessairement disponible non plus.En utilisant les fonctions intégrées et sed, nous pouvons rapidement créer un script shell pour ce faire, ce qui nous donne une syntaxe très similaire au script de changement de nom perl, tout en manquant de gentillesse de gestion des erreurs, il fait le travail.
Usage
Supposons que nous voulions également créer des dossiers cibles ...
Étant donné
mv
que ne crée pas de dossiers que nous ne pouvons pas utilisersedrename
tels qu'ils sont ici, mais c'est un assez petit changement, donc je pense que ce serait bien de l'inclure aussi.Nous avons besoin d'une fonction utilitaire
abspath
(ou d'un chemin absolu) pour pouvoir générer le ou les dossiers cibles pour un modèle sed / rename qui inclut une nouvelle structure de dossiers.Cela garantira que nous connaissons les noms de nos dossiers cibles. Lorsque nous renommerons, nous devrons l'utiliser sur le nom du fichier cible.
Voici le script complet du dossier ...
Bien sûr, cela fonctionne toujours lorsque nous n'avons pas de dossiers cibles spécifiques.
Si nous voulions mettre toutes les chansons dans un dossier,
./Beethoven/
nous pouvons le faire:Usage
Tour bonus ...
Utilisation de ce script pour déplacer des fichiers de dossiers dans un seul dossier:
En supposant que nous voulions rassembler tous les fichiers correspondants et les placer dans le dossier actuel, nous pouvons le faire:
Remarque sur les modèles d'expression régulière sed
Les règles de modèle sed standard s'appliquent dans ce script, ces modèles ne sont pas PCRE (Perl Compatible Regular Expressions). Vous auriez pu avoir une syntaxe d'expression régulière étendue sed, en utilisant soit
sed -r
oused -E
selon votre plateforme.Voir le conforme POSIX
man re_format
pour une description complète des modèles regexp de base et étendus sed.la source