5 façons différentes de renommer les fichiers dans Linux
Sommaire
Liens rapides
-
Avec une boucle pour la boucle, le globbing et la substitution des paramètres
L'une des tâches les plus courantes pour les nouveaux à Linux est le renommage des fichiers par lots. Si vous n'êtes pas habitué à un shell Linux, cela peut ressembler à une tâche qui est forcément manuelle et qui prend du temps. Mais il existe de nombreuses façons d'accélérer le processus; Vous avez juste besoin de savoir ce qui est le mieux.
Exemple de tâches de déplacement de fichiers
Pour démontrer chaque approche, j'utiliserai deux exemples qui représentent des tâches de renommée courantes que vous voudrez peut-être effectuer. Il existe de nombreuses façons de renommer les fichiers, selon leurs noms actuels et ce que vous faites réellement. Les deux exemples de tâches que j'utiliserai peuvent aider à illustrer l'utilisation typique de chaque outil. Cependant, vous devrez enquêter sur l'outil de votre choix pour comprendre comment l'utiliser au mieux pour vos besoins particuliers.
Travailler ce que vous voulez réellement faire est probablement la partie la plus difficile du renommage des fichiers par lots. Considérez les parties du nom de chaque fichier que vous voudrez peut-être supprimer, que vous voudrez peut-être conserver et que vous voudrez peut-être traduire dans autre chose.
La première tâche consiste à modifier l'extension de tous les fichiers correspondants dans le répertoire actuel. Par exemple, la modification d'une extension «.txt» en «.md» devrait renommer le test-001.txt pour test-001.md et renommer un autre.txt vers un autre.md. Il devrait s'appliquer aux fichiers se terminant par «.txt» et aucun autre.
La deuxième tâche est un peu plus compliquée, pour montrer des fonctionnalités plus avancées de ces outils. Il devrait supprimer une partie spécifique d'un nom de fichier, gardant tout le reste intact. Il doit s'appliquer à tous les fichiers, récursivement. Plus précisément, je chercherai tous les fichiers du formulaire dddd_something.ext et je les renomment dddd.ext. Il devrait donc changer 1234_this-is-my-doc.doc à 1234.doc et docs / 9999_about.txt à docs / 9999.txt.
1
Avec une boucle pour la boucle, le globbing et la substitution des paramètres
Cette première approche utilise plusieurs caractéristiques de la coquille de bash, que de nombreux autres obus ont emprunté. Le premier est l'humble pour la boucle, qu'il utilisera pour itérer un ensemble de fichiers candidats. Deuxièmement, il identifie ces fichiers à l'aide d'un globe, un type de modèle optimisé pour la correspondance du nom de fichier. Enfin, cette approche utilise une syntaxe qui vous permet de modifier des chaînes en fonction de certains modèles, appelés substitution de paramètres.
Pour la première tâche, vous pouvez modifier les extensions .txt en .md en utilisant ce code de shell:
for file in ./*.txt;
do
mv -- "$file" "${file%.txt}.md";
done
La boucle pour les itères via tous les fichiers qui correspondent au glob ./*.SMS. Cela correspondra à tous les fichiers du répertoire actuel qui se termine dans l'extension «.txt».
La commande à l'intérieur de la boucle pour déplace le fichier vers un nouveau nom, qu'il génère avec l'opérateur%. Ce symbole retire d'une chaîne la partie la plus courte d'un motif qui correspond à l'extrémité de celui-ci. Dans ce cas, il supprime «.txt» de la fin de chaque nom de fichier, puis ajoute «.md» à la fin.
Tous les exemples de cet article sont illustratifs et ne doivent pas être utilisés naïvement dans un environnement de production. Pour une solution robuste, vous devez déterminer si vos fichiers peuvent contenir des caractères spéciaux – en particulier, des espaces – et vous devriez toujours avoir une politique de sauvegarde pour se prémunir contre les échecs.
La deuxième tâche commence par un modèle de globe beaucoup plus compliqué pour gérer à la fois la récursivité et un ensemble plus large de fichiers:
for file in ./**/((:digit:))((:digit:))((:digit:))((:digit:))_?*.*;
do
mv -- "$file" "${file//_*./.}";
done
Le ./**/ se développe pour correspondre au répertoire actuel et à tous les répertoires imbriqués, à n'importe quel niveau en dessous de celui-ci. Le ((:chiffre:)) Le motif correspond à un seul chiffre, donc quatre de suite, suivis d'un soulignement, correspondra à nos fichiers requis.
En rapport
Quand est-il préférable d'utiliser #! / Bin / bash au lieu de #! / Bin / sh dans un script shell?
Lorsque vous créez un nouveau script de shell, vous voulez vous assurer qu'il est aussi sans problème que possible, mais parfois il peut être un peu déroutant de savoir quel shebang est le meilleur pour vous.
Assurez-vous de comprendre quel shell vous utilisez pour exécuter cette commande et quelles fonctionnalités de globbing il prend en charge.
Pour activer le globe récursif dans Bash 4+, assurez-vous de courir shopt -s globstarsoit en tant que commande ponctuelle, soit dans votre script. Sur Mac, le shell Zsh prend en charge le globe récursif par défaut.
2
Avec une boucle et SED
Une autre option pour la commande à l'intérieur de votre boucle est SED, l'éditeur de flux. Le programme SED doit être disponible sur n'importe quel Linux, y compris MacOS.
for file in ./*.txt;
do
mv -- "$file" "$(echo "$file" | sed -e 's/txt$/md/')";
done
La différence dans cette version est que la substitution des paramètres est remplacée par la substitution de commande et un appel à SED. Le $ (…) La syntaxe entraîne l'exécution de la commande et sa sortie est remplacée à ce stade.
L'expression régulière transmise à SED remplace la valeur « TXT » à la fin de chaque nom de fichier par « MD ». Le $ dans le modèle garantit que le match a lieu à la fin d'un nom de fichier.
Dans la deuxième tâche, l'expression régulière devient encore plus complexe, bien que l'approche de base reste la même:
for file in ./**/((:digit:))((:digit:))((:digit:))((:digit:))_*.*;
do
mv -- "$file" "$(echo "$file" | sed -E -e 's/(((:digit:)){4})_.+(..+)/12/')";
done
Notez que la syntaxe d'expression régulière de SED prend en charge les opérateurs de répétition comme {4}ce qui vous permet d'éviter l'approche plus verbeuse dans le modèle global.
Bien que ces solutions SED soient un peu plus longues que leurs homologues de substitution de paramètres, elles peuvent être plus lisibles, en particulier pour ceux qui ont une compréhension des expressions régulières et du SED. Son soutien aux expressions régulières, ainsi que diverses autres fonctionnalités, signifie que SED est une alternative beaucoup plus puissante. Pour les exigences complexes, cela peut en faire une option préférée.
3
Utilisation de la commande Rename
La commande Rename est un script Perl avec la prise en charge de l'exécution du code Perl arbitraire, optimisé pour gérer le renommage des fichiers. Cela signifie qu'il est très puissant, même si vous devrez l'installer sur un système avec Perl disponible.
Une fois installé, le renommée est très facile à utiliser pour des tâches simples, telles que le renvoi d'extension de notre premier exemple:
rename 's/txt$/md/' ./*.txt
Notez comment l'expression régulière est identique à celle de l'exemple SED équivalent. Ici, cependant, l'avantage concerne le traitement par renommée des entrées de nom de fichier. Le programme appliquera sa substitution à chaque argument de nom de fichier, donc l'utilisation d'un glob qui se développe à tous les fichiers .txt signifie que vous pouvez terminer la tâche avec une ligne.
La commande Rename prend en charge un -n/ /– rythme Option, qui imprime un journal des modifications potentielles, sans renommer des fichiers. Il s'agit d'un excellent filet de sécurité que je vous recommande d'utiliser dans la mesure du possible.
Vous avez également besoin d'une commande à une ligne pour la deuxième tâche, même si l'expression régulière est un peu plus compliquée.
rename 's/(/d{4})_.*(..*)/$1$2/' ./**/*
Notez, encore une fois, que cela profite de la prise en charge étendue du blog pour les répertoires récursifs.
4
Utilisez ZMV avec Zsh
Si vous utilisez ZSH, le Shell Z, il y a une autre option à portée de main, vous avez permis de l'activer d'abord. ZMV est une fonction de shell qui agit comme une version simplifiée de Renomment. Vous devrez le charger, soit au cas par cas, soit via un script de démarrage comme .zshrc – en utilisant cette commande:
autoload zmv
Une fois activé, vous pouvez appeler ZMV comme tel, pour effectuer la première tâche:
zmv -W '*.txt' '*.md'
Contrairement à renommer, ZMV nous ramène au globe au lieu d'expressions régulières, donc c'est un peu moins puissant. Mais, comme vous pouvez le voir à partir de cet exemple, il est facile à utiliser; L'option -W simplifie la syntaxe encore plus au-delà de la valeur par défaut.
Comme il s'agit d'une fonction de shell, ZMV n'a pas de page Man intégrée. Mais vous pouvez en trouver des informations à ce sujet via homme zshContrib plutôt. En particulier, notez qu'il prend également en charge un -n Option pour effectuer une course à sec.
Étant donné que le ZMS nécessite ZSH, il profite du globbing prolongé que la coquille fournit, y compris les récursiteurs en sous-répertoires.
zmv '(**/)((0-9)(0-9)(0-9)(0-9))_*(.*)' '$1$2$3'
Sans support d'expression régulière, ce modèle est un peu plus long, mais toujours très lisible.
5
Utilisation de MMV
MMV signifie « Multiple Move » et c'est un autre outil spécialement conçu pour gérer le renommage des fichiers en vrac. Vous aurez probablement besoin de l'installer, mais ce n'est qu'un simple cas de sudo apt install mmv (Ubuntu), sudo yum install mmv (Rhel / Centos / Fedora), Brew Installer MMV (Mac), ou l'équivalent de votre gestionnaire de package de choix.
Une fois installé, vous pouvez utiliser l'outil pour renommer facilement les extensions:
mmv '*.txt' '#1.md'
La grande différence avec MMV est la façon dont il gère les modèles et les correspondances. En plus des faunes les plus familières, MMV soutient également un ; La jacasse que vous pouvez utiliser pour correspondre à n'importe quel nombre de répertoires, qui soutient la nature récursive de la deuxième tâche:
mmv -n ';(0-9)(0-9)(0-9)(0-9)_*.*' '#1#2#3#4#5.#7'
Notez également comment MMV prend en charge les références aux correspondances, non pas via les parenthèses typiques, mais en attribuant un numéro unique à chaque joker individuel. Cela nous donne sept matchs différents dans l'expression finale du remplacement: un pour le chemin d'attaque correspondant à ;un pour chacun des quatre chiffres, un – # 6 – pour tous les caractères après le soulignement, que nous jetons, et un pour l'extension après la période.
En raison de cette approche, le MMV pourrait être trop encombrant pour les tâches qui impliquent trop de caractères génériques dans le modèle initial. Mais lorsque vous effectuez des tâches comme l'échange d'extension commun, il est difficile de battre pour la simplicité et la lisibilité.
Bien qu'il existe de nombreuses options pour le renommage des fichiers en vrac dans Linux, chacun prend un peu de temps pour s'y habituer. Je recommande d'en choisir un qui a l'air le plus accessible et de le connaître aussi bien que possible, en faisant une utilisation libérale de la -n / – run à sec Option pour les outils qui le prennent en charge.
Si vous êtes un fan d'expressions régulières, il est difficile de battre leur puissance et un outil comme Renomment vous servira probablement bien. Si, d'un autre côté, vous êtes plus un gourou de Shell, un sorcier avec des jokers, vous aimerez probablement l'apparence du ZMV ou du MMV. Mais ces outils ne sont bons que si vous utilisez le shell Z, ou si vous les installez et apprenez respectivement leur syntaxe idiosyncratique.
Pendant ce temps, la substitution des paramètres peut être étonnamment puissante, et vous voudrez peut-être répéter votre renommage en vrac, donc l'écriture d'un script de shell présente d'autres avantages. En fin de compte, le choix vous appartient, et l'une de ces options est préférable à renommer manuellement des centaines de fichiers à l'aide d'une interface graphique. C'est la puissance de la ligne de commande.
