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 :
-
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.
-
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"
.
-
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
).
-
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
Comment savez-vous que le
07
sur130307
est1907
et non2007
? 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.
0 votes
De combien de fichiers parlons-nous ?
1 votes
Il s'agit de scans des registres des procès-verbaux de la Folk-Lore Society et le format des noms reflète la date de 19XX (les scans vont jusqu'à 1999 par coïncidence). Comme toujours, fournissez toujours le contexte complet.... @Buscar Je n'ai pas de compte exact mais chaque tif fait environ 19 mb et un ensemble de dossiers fait 15 gb et un autre ensemble fait 35 gb.
1 votes
¡! chiollaghbooks.com/temp/Legacy%201.jpeg
1 votes
¡! chiollaghbooks.com/temp/Legacy%202.jpeg
0 votes
Intéressant, merci. Et pourquoi avez-vous besoin que la date soit inversée dans le nom du fichier ?
0 votes
À 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. Les noms de dossiers sont impossibles à utiliser tels quels, car l'ordre du calendrier n'est pas présent. Je n'ai pas été impliqué dans ce projet au départ, il s'agit donc d'un combat contre le feu à grande échelle. Il y a d'autres problèmes, mais ils ne sont pas liés à celui du nom des fichiers.