Renommer par lots - plusieurs types d'images

2

J'ai un grand nombre d'images que j'ai copiées à partir d'un disque dur externe défaillant. Toutes les images sont correctes et ne sont pas corrompues, mais curieusement, un grand nombre d’entre elles ne portent plus d’extension. Les fichiers sont un mélange de jpg, png et gif et sont nommés dans la structure suivante, tous dans un seul dossier.

1
2
3
4.jpg
5.png

etc

Certains fichiers ont des extensions, alors que beaucoup ne le sont pas et ne sont que des chiffres. Il y a environ 4000 images dans ce dossier, le renommage manuel n'est donc pas une option.

Existe-t-il un script ou un programme permettant de déterminer l’extension via des métadonnées et de l’ajouter aux fichiers si nécessaire?

J'ai utilisé "pyrenamer" du centre de logiciels pendant des années pour renommer des fichiers, mais il ne semble pas pouvoir ajouter d’extensions.

Toute aide serait grandement appréciée, mon codage est nul et je ne peux pas le comprendre seul.

    
posée KhaosDvorak 20.10.2014 - 12:07
la source

3 réponses

4

Ci-dessous une solution python (script).

Le script utilise le module imghdr pour reconnaître le type de fichier. Il ajoutera les extensions de fichier correctes (si elles sont manquantes), des types suivants:

rgb, gif, pbm, pgm, ppm, tiff, rast, xbm, jpeg, bmp, png 

Si le fichier a déjà une extension de fichier, il sera ignoré. Si le fichier est d'un type de fichier inconnu (s'il est endommagé par exemple), le fichier est signalé comme "impossible à déterminer":

could not determine: /home/jacob/Bureaublad/picturetest/blub

Le script:

#!/usr/bin/env python3

import os
import imghdr
import shutil

directory = "/path/to/pictures"

for name in os.listdir(directory):
    # combining file+its directory:
    file = directory+"/"+name
    # only files without a dot are subject to renaming (else the file already has a file extension or is a hidden file):
    if name.count(".") == 0:
        # fetch the file extension from the file:
        ftype = imghdr.what(file)
        # if it is impossible to get the extension (if the file is damaged for example), the file(s) will be listed in the terminal window:
        if ftype != None:
            shutil.move(file, file+"."+ftype)
        else:
            print("could not determine: "+file)

Collez-le dans un fichier vide, enregistrez-le sous le nom rename.py, définissez le répertoire sur les images dans directory = "/path/to/pictures" -line et exécutez-le par la commande:

python3 /path/to/rename.py

Renommez récursivement

Si vos images ne sont pas dans un répertoire "plat", mais dans un répertoire en couches, utilisez la version ci-dessous. Il vérifie (et répare si nécessaire) les extensions de fichiers dans le dossier actuel du fichier.

#!/usr/bin/env python3

import os
import imghdr
import shutil

directory = "/path/to/pictures"

for root, dirs, files in os.walk(directory):
    for name in files:
        file = root+"/"+name
        if name.count(".") == 0:
            ftype = imghdr.what(file)
            if ftype != None:
                shutil.move(file, file+"."+ftype)
            else:
                print("could not determine: "+file)
    
réponse donnée Jacob Vlijm 20.10.2014 - 13:25
la source
2

Une ligne à l'aide de la commande rename :

rename 's/.*/use File::MimeInfo::Magic qw#mimetype extensions#; sprintf("%s.%s", $&, extensions(mimetype($&)))/e' * -vn

il utilise le module Perl File::MimeInfo pour interroger le fichier (une sorte de la commande file ) pour déterminer le fichier, puis pour ajouter la première extension que MimeInfo a pour ce type MIME dans le fichier .

Dans certains cas, les extensions les moins utilisées peuvent être utilisées (comme jpeg ou jpe pour ce que la plupart des gens appellent des fichiers jpg), mais vous pouvez faire une seconde passe pour les corriger assez facilement:

rename 's/\.jpe$/.jpg/' *

Mais la plupart des applications n’auront pas de problème si vous spécifiez des fichiers .jpe, ce qui n’est pas nécessaire la plupart du temps.

Les deux commandes rename ci-dessus sont définies en mode test.
Ils ne feront rien tant que vous ne supprimerez pas l'argument -n de la fin.

    
réponse donnée Oli 20.10.2014 - 13:22
la source
1

Script simple

#!/bin/bash

for file in ~/path/to/images/*; do
    TYPE=$(file --mime-type -b "$file" | cut -f2 -d/);
    if [[ ! $file =~ \.$TYPE ]]; then
        echo mv -v "$file" "$file.$TYPE";
    fi
done

Explication de TYPE=$(file --mime-type -b "$file" | cut -f2 -d/); (recherche du type de fichier)

recherchez l’extension de chaque $file en utilisant la commande file (determinez le type de fichier).

Option

--mime-type, --mime-encoding utilisée pour imprimer uniquement les éléments spécifiés.

L'option

-b, --brief utilisée pour ne pas ajouter les noms de fichiers aux lignes de sortie (mode bref).
Voir aussi fichier man pour plus d'informations.

Maintenant, nous avons extrait le type de fichier et l’avons enregistré dans la variable TYPE .

Quelle est la commande cut -f2 -d/ ? Cette option est utilisée pour imprimer uniquement le type d'extension, comme png dans image/png de la sortie du résultat file --mime-type -b "$file" .

-f2 imprime la deuxième partie avec / delimiter (option -d ) entre les champs. ex: Imprimer png en image/png . Voir aussi man cut pour plus d'informations.

Explication de if [[...]]; (vérification de l’extension du fichier)

Nous avons ignoré toutes les extensions existantes avec une simple expression rationnelle, en utilisant l’opérateur =~ dans un test [[...]] dans la condition if:

if [[ $file =~ \.$TYPE ]];

Alors que $file est le nom de vos images et que $TYPE est son extension que nous avons trouvée et stockée dans la variable TYPE en TYPE=$(file --mime-type -b "$file" | cut -f2 -d/); .

Ensuite, nous sautons pour renommer tous les fichiers ayant une extension avec eux-mêmes.

! se réfère à: si le fichier ne possède PAS d'extension avec lui-même, renommez-le et ajoutez son extension à la fin de son nom.

Explication de echo mv -v "$file" "$file.$TYPE"; (renommer l'étape)

Dans cette ligne En fait, nous ajoutons l’extension de fichier (si $file n’a pas d’extension avec elle-même) à la fin du fichier $file en utilisant la commande mv . mv utilise également pour renommer Files / Directory.

Ensuite, nous renommons $file en $file.$TYPE . Par exemple, le fichier 1 sera renommé en 1.png si son type de fichier était png format.

in theory actually above mv command do this: rename filename -> filename.filetype

Le nom de fichier stocké dans la variable $file et le type de fichier stocké dans la variable $TYPE .

Comment pouvez-vous utiliser ce script?

Copiez et collez le script dans gedit et enregistrez-le sous votre nom préféré ex: batchRename , puis Ouvrez Terminal et exécutez-le par la commande suivante:

bash batchRename

N'oubliez pas avant d'exécuter le script de vérifier le chemin correct des images /path/to/images/ et de renommer vos fichiers après avoir vérifié le résultat avec la commande echo , supprimez echo du début echo mv -v "$file" "$file.$TYPE" et exécutez à nouveau le script aime renommer;)

    
réponse donnée αғsнιη 20.10.2014 - 12:47
la source

Lire d'autres questions sur les étiquettes