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

Contenu

Voulez-vous renommer un ensemble complet de fichiers en une séquence de nombres (1.pdf, 2.pdf, 3.pdf,…) fr Linux? Cela peut être fait avec des scripts légers et cet article vous montrera comment faire exactement cela.

Noms de fichiers numériques

En général, lorsque nous scannons un fichier PDF avec du matériel (téléphone portable, scanner PDF dédié), le nom du fichier lira quelque chose comme 2020_11_28_13_43_00.pdf. De nombreux autres systèmes semi-automatiques 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 qui est utilisée, ou d'autres informations comme, par exemple, le DPI (points par pouce) format de papier applicable ou numérisé.

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

Ceci s'applique également à d'autres domaines et ensembles de fichiers. Par exemple, vos recettes ou collection de photos, échantillons de données générés dans des systèmes de surveillance automatisés, fichiers journaux prêts à être archivés, un ensemble de fichiers SQL pour l'ingénieur de base de données et, en général, toutes les données collectées à partir de différentes sources avec différents schémas de nommage.

Renommer les fichiers en vrac en noms de fichiers numériques

En Linux, il est facile de renommer rapidement tout un ensemble de fichiers avec des noms de fichiers totalement différents, à une suite de nombres. "Facile" signifie "facile à exécuter" ici: le problème de renommer les fichiers en nombres numériques est complexe à encoder lui-même: le script en ligne ci-dessous est tiré de 3 une 4 heures pour enquêter, créer et tester. De nombreuses autres commandes testées, ils avaient tous des limitations que je voulais éviter.

Veuillez noter qu'aucune garantie n'est faite ou fournie, et ce code est fourni “mais qu'en est-il des produits moins”. Faites vos propres recherches avant de courir. Cela dit, Je l'ai testé avec succès contre des fichiers avec pas mal de caractères spéciaux, et aussi contre plus de 50k fichiers sans perdre aucun fichier. J'ai aussi vérifié un fichier appelé 'a'$'n''a.pdf' contenant une nouvelle ligne.

si [ ! -r _e -a ! -r_c ]; puis echo 'pdf' > _e; écho 1 > _c ;trouve . -Nom "*.$(chat _e)" -imprimer0 | xargs -0 -je{} bash -c 'mv -n "{}" $(chat _c).$(chat _e);écho $[ $(chat _c) + 1 ] > _c'; rm -f _e _c; être

Voyons d'abord comment cela fonctionne et plus tard analysons la commande. Nous avons créé un répertoire avec huit fichiers, tous avec des noms très différents, sauf que son extension correspond et est .pdf. Ensuite, nous exécutons la commande précédente:

Renommer les fichiers en vrac en noms de fichiers numériques sous Linux

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

La commande suppose que vous n'avez aucun 1.pdf pour x.pdf fichiers encore nommés. S'il le fait, vous pouvez déplacer ces fichiers dans un répertoire séparé, met le echo 1 à un nombre plus élevé pour commencer à renommer les fichiers restants à un décalage donné, et plus tard fusionner à nouveau les deux répertoires.

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

Voyons la commande en détail. Vous pouvez aider à voir ce qui se passe en ajoutant le -t option une xargs 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 (appelé _moi et _C) comme stockage temporaire. Au début de l'eye-liner, faire un vérification de sécurité utilisant un if déclaration pour s'assurer que les deux _moi et _C les fichiers ne sont pas présents. S'il y a un fichier avec ce nom, le script ne continuera pas.

Sur le thème de l'utilisation de petits fichiers temporaires par rapport aux variables, je peux dire que, bien que l'utilisation de variables aurait été idéale (économiser quelques E / Disque S), il y avait deux problèmes que je rencontrais.

La première est que si vous EXPORTEZ une variable au début de la doublure et utilisez ensuite cette même variable plus tard, si un autre script utilise la même variable (y compris ce script qui s'exécute plusieurs fois simultanément sur la même machine), donc ce script, Ouest, peut être affecté. Il est préférable d'éviter de telles interférences lorsque vous essayez de renommer de nombreux fichiers !!

La seconde é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 des recherches en ligne approfondies n'ont pas fourni de solution viable pour cela.. Pour cela, j'ai fini par utiliser un petit fichier _C qui gardent le progrès.

_moi C'est l'extension que nous allons rechercher et utiliser, et _C est un compteur qui augmentera automatiquement à chaque changement de nom. Les echo $[ $(cat _c) + 1 ] > _c le code s'en occupe, montrant le fichier avec cat, ajouter un nombre et le réécrire.

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

La commande de recherche recherchera n'importe quel fichier avec l'extension spécifiée dans le _moi déposer (créé par le echo 'pdf' > _e commander. Vous pouvez faire varier cette extension à n'importe quelle autre extension que vous voulez, mais ne le préfixe pas d'un point. Le point est déjà inclus dans le dernier *.$(cat _e) -name spécificateur pour find.

Une fois que vous trouvez, avoir localisé tous les fichiers et les avoir envoyés: fini de xargs, xargs renommera les fichiers un par un en utilisant le fichier compteur (_C) et la même extension de fichier (_moi). Pour obtenir le contenu des deux fichiers, Un simple cat la commande est utilisée, s'exécutant à partir d'une sous-couche.

Les mv commande de déplacement utilise -n pour éviter d'écraser les fichiers déjà présents. Enfin on nettoie les deux fichiers temporaires en les supprimant.

Bien que le coût d'utilisation de deux fichiers d'état et de branchement de sous-couche puisse être limité, cela ajoute un peu de surcharge au script, surtout 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 entièrement fonctionnelle. De nombreuses solutions ont oublié toutes sortes de valises latérales, comment utiliser ls Indéterminé --color=never, ce qui peut conduire à l'analyse des codes hexadécimaux lors de l'utilisation du codage couleur de la liste des répertoires.

Malgré cela, d'autres solutions ont ignoré la gestion des fichiers avec des espaces, nouvelles lignes et caractères spéciaux tels que ” correctement. Pour ca, la combinaison find ... -print0 ... | xargs -0 ... est généralement indiqué et idéal (et à la fois le conditions et xargs les manuels font assez fortement allusion à ce fait).

Bien que je ne considère pas ma mise en œuvre comme la réponse parfaite ou finale, semble être une avancée significative pour de nombreuses autres solutions, lors de l'utilisation find et chaînes finies, sécurisation prise en charge maximale des noms de fichiers et de l'analyse, tout en ayant d'autres subtilités, comment spécifier un déplacement initialet être totalement originaire de bash.

Prendre plaisir!

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.