1 votes

Besoin d'un script ou d'une application pour convertir les noms de fichiers et de dossiers de l'ordre jour/mois/année à l'ordre année/mois/jour.

On m'a récemment envoyé un grand nombre de fichiers tif dont les noms, pour une raison inconnue, ont tous été enregistrés au format JJ/MM/AA, c'est-à-dire 130307, alors que j'ai besoin du format AAAA MM JJ. Les fichiers sont également préfixés comme indiqué ici : GC Mins 130307 004.tif (cela peut rester, mais la possibilité de le modifier serait également la bienvenue).

Les fichiers sont placés dans des dossiers eux-mêmes nommés de manière similaire : 07 Dec 08 jan 13 oct.

Ceux-ci doivent également être convertis en yyyy mm dd.

Toute aide est la bienvenue sur ce qu'il faut faire pour résoudre ce problème, car le renommage par force brute n'est pas vraiment possible étant donné le nombre de fichiers, qui s'élève à plusieurs milliers.

1 votes

Comment savez-vous que le 07 sur 130307 est 1907 et non 2007 ? Il serait également utile de voir une capture d'écran de la structure hiérarchique des dossiers montrant clairement les noms des dossiers et des fichiers. En outre, tous les dossiers cibles sont-ils situés dans un seul dossier et tous les fichiers cibles dans ces dossiers sont-ils situés dans un seul dossier ?

1 votes

@user3439894 bon point, la logique voudrait qu'il n'y ait pas eu de fichiers enregistrés en 1907 :)

0 votes

Buscar, L'appareil photo existe depuis 1816 et je suppose qu'il est concevable que les images tiff que le PO a pourraient être des scans numérisés de photos de 1907, je viens de numériser un tas de photos d'un album photo de la Seconde Guerre mondiale, c'est donc l'une des raisons pour lesquelles je demande. Cela dit, je ne vais pas écrire de code pour résoudre le problème tant que les informations demandées dans mon premier commentaire ne sont pas fournies.

2voto

OnePablo Points 1

En dehors de la solution tierce de TJ Luoma (une bonne solution pour les situations à long terme, mais peut-être pas quelque chose que vous souhaitez payer s'il s'agit d'une entreprise ponctuelle), personne n'a encore proposé de solution programmatique à votre dilemme.

J'ai attendu jusqu'à maintenant car, il est vrai que, malgré vos captures d'écran, je n'ai toujours pas une image claire de la structure de vos dossiers (en général, nonobstant les deux exemples spécifiques que vous avez fournis), et j'espérais donc que quelqu'un d'autre aurait interprété ce que je n'ai pas pu, et aurait posté une solution.

Cependant, j'ai ensuite remarqué votre dernier commentaire, qui m'évite d'avoir à vous interroger davantage sur ce qui est quoi :

À la fin de la journée, nous souhaitons consolider tous les fichiers dans un seul dossier annuel et nous devons donc être en mesure de les trier dans l'ordre.

Cela signifie que, pour autant que toutes les images en question soient situées dans un seul répertoire arbre qui ne contient pas d'autres fichiers d'images qui ne sont pas destinés à être traités en même temps qu'eux, je peux, je l'espère, résoudre votre problème pour vous :

property this : a reference to current application
--------------------------------------------------------------------------------
###USER-DEFINED PROPERTIES
property rootdir : "~/Example"
property imgTypes : ["tif", "tiff", "png", "jpg"]
property moveFiles : no
property moveTo : rootdir
--------------------------------------------------------------------------------
###IMPLEMENTATION
#
#
tell the directory to filter by imgTypes
reformatFilenames() of imageFiles

if moveFiles  yes then return
tell the imageFiles to move
--------------------------------------------------------------------------------
###SCRIPT OBJECTS & HANDLERS
#
#
script directory
    use framework "Foundation"

    property NSDirectoryEnumerationSkipsHiddenFiles : a reference to 4
    property NSFileManager : a reference to NSFileManager of this
    property NSPredicate : a reference to NSPredicate of this
    property NSString : a reference to NSString of this
    property NSURL : a reference to NSURL of this
    ------------------------------------------------------------------------
    property images : null
    ------------------------------------------------------------------------
    to recurse thru directory
        local directory

        set FileManager to NSFileManager's defaultManager()

        FileManager's enumeratorAtURL:(NSURL's ¬
            URLWithString:((NSString's ¬
                stringWithString:directory)'s ¬
                stringByStandardizingPath())) ¬
            includingPropertiesForKeys:{} ¬
            options:NSDirectoryEnumerationSkipsHiddenFiles ¬
            errorHandler:(missing value)
    end recurse

    to filter by filetype
        local filetype

        recurse thru rootdir
        set images to (result's allObjects()'s ¬
            filteredArrayUsingPredicate:(NSPredicate's ¬
                predicateWithFormat:("pathExtension IN %@") ¬
                    argumentArray:[filetype])) as list
    end filter
end script

script imageFiles
    use framework "Foundation"

    property NSMutableArray : a reference to NSMutableArray of this
    property NSRegEx : a reference to NSRegularExpression of this
    ------------------------------------------------------------------------
    to matchString against pattern from str into fmt
        local pattern, str, fmt
        local results

        set results to NSMutableArray's array()

        NSRegEx's regularExpressionWithPattern:pattern ¬
            options:(NSRegularExpressionCaseInsensitive of this) ¬
            |error|:(missing value)

        set RegEx to the result

        repeat with match in (RegEx's matchesInString:str ¬
            options:0 range:[0, str's length])

            (results's addObject:(RegEx's ¬
                replacementStringForResult:match ¬
                    inString:str ¬
                    offset:0 ¬
                    template:fmt))
        end repeat

        return the results as list
    end matchString

    to reformatFilenames()
        tell application "System Events" to repeat with img in ¬
            (a reference to |images| of the directory)

            set fp to the POSIX path of (img as alias)

            set [fname] to (matchString of imageFiles ¬
                against ("(.+)/(.*?)( )?" & ¬
                "((\\d{2})(\\d{2})(\\d{2}))" & ¬
                "( )?([^/]+)") ¬
                from fp ¬
                into "$1/19$7-$6-$5$3$2$8$9") & {null}

            if fname  null then set ¬
                [name of file fp, fp] to ¬
                [fname, fname]

            set contents of img to file fp
        end repeat
    end reformatFilenames

    to make (dir as text)
        tell application "System Events" to if not (folder named dir in ¬
            folder moveTo exists) then make new folder at ¬
            folder moveTo with properties {name:dir}
    end make

    to move
        tell application "System Events" to repeat with img in ¬
            the directory's |images|

            set y to the first word of (img's name as text)
            tell imageFiles to make y
            move img to the folder named y in folder moveTo
        end repeat
    end move
end script
---------------------------------------------------------------------------END

Infos système : Version d'AppleScript : "2.7", version du système : "10.13.6"

Ce que fait ce script : Étant donné un chemin vers un dossier source (Root) sous lequel toutes vos images sont contenues quelque part dans n'importe quel sous-dossier, ce script obtiendra le contenu entier - fichiers, dossiers, paquets, alias, etc. - de l'arborescence de répertoires dont le Root est au dossier source spécifié. Les fichiers cachés sont ignorés. Il filtre ensuite tous ces éléments pour isoler uniquement ceux dont l'extension de fichier correspond à une liste prédéterminée d'extensions valides fournies. Le tableau de fichiers filtrés est ensuite parcouru un par un pour renommer chaque fichier en fonction de vos spécifications (voir ci-dessous). Si nécessaire, les fichiers renommés sont déplacés vers un nouvel emplacement, organisé sous un répertoire de premier niveau spécifié par le chemin d'accès fourni qui pointe vers un dossier existant sur votre système. Les fichiers sont classés dans des sous-dossiers étiquetés par année, par ex. "1994" . Si le sous-dossier n'existe pas, il est créé. Les fichiers préexistants sont no écrasé dans mes tests, mais cela peut dépendre de votre version d'AppleScript et de MacOS.

En utilisant ce script : Vous pouvez copier et coller ce script dans scriptÉditeur et l'exécuter à partir de là. Il y a quatre propriétés définies par l'utilisateur près du sommet du script que vous pouvez (et devez) modifier selon vos besoins :

  1. rootdir : Le dossier de premier niveau de l'arborescence de répertoires dans lequel se trouvent les fichiers d'image à traiter. Les fichiers peuvent être situés dans le dossier de premier niveau lui-même, ou dans tout sous-répertoire qu'il contient. Il doit s'agir d'un chemin posix (notation slash), et l'utilisation d'un tilde ( ~ ) pour représenter le répertoire personnel est correct, tout comme le serait un chemin de fichier complet.

  2. imgTypes : Une liste d'extensions de fichiers (sans le point initial) qui sera utilisée pour distinguer les types de fichiers à traiter. Les images dans vos captures d'écran ont toutes une extension "tif" Vous pouvez donc laisser cette propriété telle quelle, ou ajouter des extensions supplémentaires si nécessaire, par ex. "gif" .

  3. moveFiles : yes pour que les fichiers soient relocalisés dans un seul dossier après avoir été renommés ; no de les laisser là où ils sont (ne pas mettre de guillemets autour de yes ou no ).

  4. moveTo : Le répertoire de destination dans lequel les images seront déplacées et organisées en sous-dossiers après renommage. Si moveFiles est réglé sur no cette propriété est ignorée et n'affectera rien dans le script. Sinon, le chemin fourni doit, encore une fois, être un chemin posix vers un fichier de type existant dossier, qui peut être la même chose que rootdir ou tout autre dossier de votre système. Les sous-dossiers pour les images n'ont pas besoin d'exister au préalable, car ils seront créés en fonction des besoins par le script.

Quelques mises en garde : Notez que ce script utilise Événements du système pour gérer le renommage et le déplacement des fichiers. Par conséquent, il n'y a pas d'annulation.

À moins que vous ne soyez familier avec AppleScript (et spécifiquement AppleScriptObjC) et les expressions régulières (utilisées dans le reformatage des noms de fichiers), je vous déconseille de modifier vous-même toute autre partie du script. Si vous le faites, il est probable que le script ne fonctionnera pas, ce qui n'est pas un problème ; mais il ne faut pas le faire. pourrait Au lieu de cela, il finit par traiter et renommer des fichiers que vous n'aviez pas l'intention de traiter, et ce n'est pas ce que vous voulez.

Pour cette raison, je vous suggère également de tester ce script sur un petit ensemble de fichiers et de dossiers fictifs afin de vous assurer qu'il fait ce que vous voulez avant de l'appliquer à vos fichiers réels. Cela vaut également la peine de faire une sauvegarde de vos photos au préalable, juste pour être plus sûr.

Tous les avertissements mis à part, je ne prévois aucun problème si j'ai bien compris vos besoins, et si vous avez compris ce que ce script est conçu pour faire. Si vous n'êtes pas sûr, n'hésitez pas à demander des éclaircissements.

Je l'ai testé sur des fichiers avec des variations de noms de fichiers, et diverses distributions dans un ensemble de dossiers imbriqués sans aucun problème. (Mais, naturellement, cela signifie seulement qu'il n'y a pas de problèmes dans les conditions que j'ai pu imaginer).

Comment les fichiers sont renommés : Si un fichier doit être renommé, son nom de fichier actuel. doit contiennent un nombre à six chiffres représentant une date du 20ème siècle dans le format ddmmyy . S'il y a plus d'une occurrence d'un motif numérique à six chiffres dans le nom du fichier, il s'agit de l'option premièrement qui est supposée être la chaîne de date. Le reste du nom de fichier peut être n'importe quoi, à la fois avant et/ou après la chaîne de date, par ex. "%prefix% %ddmmyy% %suffix%.tif" . Ni la partie préfixe ou suffixe du nom de fichier, ni les espaces, ne sont obligatoires, ainsi un nom de fichier consistant simplement en "%ddmmyy%.tif" est considéré comme valide pour le traitement. Le nom de fichier est ensuite reformaté en intervertissant les positions du préfixe (s'il est présent) et de la chaîne de date, en laissant le reste tel quel. La chaîne de date est également reformatée dans le format international de date standard ISO, à savoir yyyy-mm-dd . Cela inclut les traits d'union (faites-moi savoir si vous voulez que les traits d'union soient omis, car je sais que cela ne faisait pas partie de vos spécifications initiales, mais c'est une pratique standard de dénomination des fichiers de les avoir présents). Pour résumer le changement de nom de fichier à l'aide d'exemples :

 "Editorial Com Mins 080594 003.tif"  "1994-05-08 Editorial Com Mins 003.tif"
 "1994-05-08 Editorial Com Mins 123456.tif"  "1956-34-12 1994-05-08 Editorial Com Mins.tif"
 "080594.tif"  "1994-05-08.tif"
 "1994-05-08 Editorial Com Mins 02.tif"  "1994-05-08 Editorial Com Mins 02.tif"

Notez dans le deuxième exemple que le nom de fichier pouvait déjà être formaté de manière appropriée au départ, mais que la présence d'un motif numérique à six chiffres signifiait qu'il était traité par le script. Cependant, dans le quatrième exemple, l'absence d'un motif de nombre à six chiffres laisse le nom de fichier inchangé.

1 votes

@Stephen 8 Si cela répond à votre question, vous devriez le marquer comme réponse acceptée.

0voto

moodforaday Points 2633

Je recommande vivement de télécharger Mangeur de noms par Many Tricks.

Je suis tout à fait capable d'écrire des scripts pour renommer des fichiers/dossiers, mais j'utilise plutôt Name Mangler. Pourquoi ?

Trois raisons :

  1. Name Mangler vous donnera un aperçu de ce à quoi ressembleront les fichiers après que les étapes de renommage auront été effectuées (et les scripts de renommage peuvent avoir n'importe quelle sorte de besoins de type regex que vous pourriez avoir).

  2. Name Mangler vous permettra d'enchaîner plusieurs étapes, si nécessaire.

  3. Name Mangler vous permettra annuler des changements, si quelque chose ne va pas.

Aucun lien avec l'entreprise, juste un client heureux.

0 votes

Merci pour cela ! J'ai regardé Name Mangler ainsi que FileRenamer qui offre la même fonctionnalité mais les deux ne feront pas ce dont j'ai besoin. Pour moi, 130307 est 1907 03 13, mais pour ces programmes, il ne s'agit que de six chiffres à la suite et aucune des opérations de date/heure/année ne fonctionne sur le nom de fichier lui-même.

0 votes

A Better Finder Rename fait exactement ce qu'il faut. publicspace.net/ABetterFinderRename/index.html

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X