Agence web » Actualités du digital » Comment renommer en bloc des fichiers en noms de fichiers numériques sous Linux –

Comment renommer en bloc des fichiers en noms de fichiers numériques sous Linux –

Shutterstock / estherpoon

Vous voulez renommer tout un ensemble de fichiers en une séquence numérique (1.pdf, 2.pdf, 3.pdf,…) sous Linux? Cela peut être fait avec quelques scripts légers et cet article vous montrera comment faire exactement cela.

Noms de fichiers numériques

Habituellement, lorsque nous numérisons un fichier PDF à l’aide d’un matériel (téléphone portable, scanner PDF dédié), le nom du fichier se lit comme suit: 2020_11_28_13_43_00.pdf. De nombreux autres systèmes semi-automatisés produisent des noms de fichiers similaires basés sur la date et l’heure.

Parfois, le fichier peut également contenir le nom de l’application utilisée, ou d’autres informations comme par exemple le DPI applicable (points par pouce) ou le format de papier numérisé.

Lors de la collecte de fichiers PDF à partir de différentes sources, les conventions de dénomination des fichiers peuvent différer considérablement et il peut être bon de normaliser sur un nom de fichier numérique (ou numérique partiel).

Cela s’applique également à d’autres domaines et ensembles de fichiers. Par exemple, vos recettes ou votre collection de photos, des échantillons de données ont généré des systèmes de surveillance automatisés, des fichiers journaux prêts pour l’archivage, un ensemble de fichiers SQL pour l’ingénieur de base de données et généralement toutes les données collectées à partir de différentes sources avec différents schémas de dénomination.

Renommer en bloc des fichiers en noms de fichiers numériques

Sous Linux, il est facile de renommer rapidement tout un ensemble de fichiers avec des noms de fichiers complètement différents, en une séquence numérique. «Facile» signifie «facile à exécuter» ici: le problème du renommage en masse des fichiers en nombres numériques est complexe à coder en soi: le script oneliner ci-dessous a pris 3-4 heures pour rechercher, créer et tester. De nombreuses autres commandes essayées avaient toutes des limitations que je voulais éviter.

Veuillez noter qu’aucune garantie n’est donnée ou fournie et que ce code est fourni «tel quel». Veuillez faire vos propres recherches avant de l’exécuter. Cela dit, je l’ai testé avec succès contre des fichiers avec divers caractères spéciaux, et aussi contre plus de 50k fichiers sans qu’aucun fichier ne soit perdu. J’ai également vérifié un fichier nommé 'a'$'n''a.pdf' qui contient une nouvelle ligne.

if [ ! -r _e -a ! -r _c ]; then echo 'pdf' > _e; echo 1 > _c ;find . -name "*.$(cat _e)" -print0 | xargs -0 -I{} bash -c 'mv -n "{}" $(cat _c).$(cat _e);echo $[ $(cat _c) + 1 ] > _c'; rm -f _e _c; fi

Voyons d’abord comment cela fonctionne, puis analysons la commande. Nous avons créé un répertoire avec huit fichiers, tous nommés différemment, sauf que leur extension correspond et est .pdf. Nous exécutons ensuite la commande ci-dessus:

Renommer en bloc des fichiers en noms de fichiers numériques sous Linux

Le résultat est que les 8 fichiers ont été renommés en 1.pdf, 2.pdf, 3.pdf, etc., même si leurs noms étaient assez décalés auparavant.

La commande suppose que vous n’avez aucun 1.pdf à x.pdf les fichiers nommés encore. Si vous le faites, vous pouvez déplacer ces fichiers dans un répertoire séparé, définissez le echo 1 à un nombre plus élevé pour commencer à renommer les fichiers restants à un décalage donné, puis fusionner à nouveau les deux répertoires.

Veillez toujours à ne pas écraser les fichiers, et c’est toujours une bonne idée de faire une sauvegarde rapide avant de mettre à jour quoi que ce soit.

Regardons la commande en détail. Cela peut aider à voir ce qui se passe en ajoutant le -t option pour xargs ce qui nous permet de voir ce qui se passe dans les coulisses:

xargs avec l'option -t nous permet de voir ce qui se passe pendant le processus de changement de nom

Pour commencer, la commande utilise deux petits fichiers temporaires (nommés _e et _c) comme stockage temporaire. Au début du oneliner, il fait un contrôle de sécurité en utilisant un if déclaration pour garantir que les deux _e et _c les fichiers ne sont pas présents. S’il existe un fichier portant ce nom, le script ne se poursuivra pas.

En ce qui concerne l’utilisation de petits fichiers temporaires par rapport aux variables, je peux dire qu’alors que l’utilisation de variables aurait été idéale (économise des E / S de disque), je rencontrais deux problèmes.

Le premier est que si vous EXPORTEZ une variable au début du oneliner et que vous utilisez ensuite cette même variable plus tard, si un autre script utilise la même variable (y compris ce script exécuté plus d’une fois simultanément sur la même machine), alors ce script, ou celui-ci, peut être affecté. Il vaut mieux éviter de telles interférences lorsqu’il s’agit de renommer de nombreux fichiers!

Le second était que xargs en combinaison avec bash -c semble avoir une limitation dans la gestion des variables dans le bash -c ligne de commande. Même une recherche approfondie en ligne n’a pas fourni de solution viable pour cela. Ainsi, j’ai fini par utiliser un petit fichier _c qui continuent de progresser.

_e Est l’extension que nous rechercherons et utiliserons, et _c est un compteur qui sera automatiquement augmenté à chaque changement de nom. le echo $[ $(cat _c) + 1 ] > _c code s’en charge, en affichant le fichier avec cat, en ajoutant un numéro et en le réécrivant.

La commande utilise également la meilleure méthode possible pour gérer les caractères spéciaux de nom de fichier en utilisant une terminaison nulle au lieu de la terminaison de nouvelle ligne standard, c’est-à-dire personnage. Ceci est assuré par le -print0 option pour find, et par le -0 option à xargs.

La commande find recherchera tous les fichiers avec l’extension spécifiée dans le _e fichier (créé par le echo 'pdf' > _e commander. Vous pouvez faire varier cette extension à n’importe quelle autre extension de votre choix, mais veuillez ne pas la préfixer avec un point. Le point est déjà inclus dans le dernier *.$(cat _e) -name prescripteur à find.

Une fois que find a localisé tous les fichiers et les a envoyés – terminé à xargs, xargs renomme les fichiers un par un en utilisant le fichier compteur (_c) et le même fichier d’extension (_e). Pour obtenir le contenu des deux fichiers, un simple cat La commande est utilisée, exécutée à partir d’un sous-shell.

le mv la commande de déplacement utilise -n pour éviter d’écraser un fichier déjà présent. Enfin, nous nettoyons les deux fichiers temporaires en les supprimant.

Bien que le coût d’utilisation de deux fichiers d’état et de la fourche de sous-shell puisse être limité, cela ajoute une surcharge au script, en particulier lorsqu’il s’agit d’un grand nombre de fichiers.

Il existe toutes sortes d’autres solutions pour ce même problème en ligne, et beaucoup ont essayé et échoué à créer une solution pleinement fonctionnelle. De nombreuses solutions ont oublié toutes sortes de valises latérales, comme l’utilisation ls sans préciser --color=never, ce qui peut conduire à l’analyse des codes hexadécimaux lorsque le codage couleur de liste de répertoires est utilisé.

Pourtant, d’autres solutions ont manqué de gérer correctement les fichiers avec des espaces, des retours à la ligne et des caractères spéciaux comme «». Pour cela, la combinaison find ... -print0 ... | xargs -0 ... est généralement indiqué et idéal (et le trouver et xargs manuels font assez fortement allusion à ce fait).

Alors que je ne considère pas ma mise en œuvre comme la solution parfaite ou finale, elle semble faire une avancée significative à de nombreuses autres solutions existantes, en utilisant find et chaînes terminées, assurant compatibilité maximale du nom de fichier et de l’analyse, ainsi que d’avoir quelques autres subtilités comme pouvoir spécifier un décalage de départ, et être pleinement Natif bash.

Prendre plaisir!

★★★★★