Aparte de la solución de terceros de TJ Luoma (una buena solución para situaciones a largo plazo, pero quizás no algo por lo que desee pagar si se trata de un esfuerzo puntual), nadie ha ofrecido todavía una solución programática a su dilema.
He esperado hasta ahora porque, hay que admitirlo, a pesar de tus capturas de pantalla, todavía no tengo una imagen clara de tu estructura de carpetas (en general, a pesar de los dos ejemplos específicos que has proporcionado), así que esperaba que alguien más hubiera interpretado lo que yo no podía, y hubiera publicado una solución.
Sin embargo, luego me fijé en tu comentario final, que me ahorra la necesidad de interrogarte más sobre qué es qué:
Al final queremos consolidar todos los archivos en una única carpeta anual, por lo que necesitamos poder ordenarlos.
Esto significa que, siempre que todas las imágenes en cuestión se encuentren en un único directorio árbol que no contenga otros archivos de imágenes que no estén destinados a ser procesados junto con ellos, espero poder resolver tu problema por ti:
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
Información del sistema: Versión de AppleScript : "2.7", versión del sistema : "10.13.6"
Qué hace este script: Dada una ruta a una carpeta de origen (root) bajo la cual se encuentran todas sus imágenes en alguna subcarpeta, este script obtendrá todo el contenido -archivos, carpetas, paquetes, alias, etc.- del árbol de directorios cuya root se encuentra en la carpeta de origen especificada. Los archivos ocultos se ignoran. A continuación, filtra todos estos elementos para aislar sólo aquellos con una extensión de archivo que coincida con una lista predeterminada de extensiones válidas suministrada. El conjunto de archivos filtrados se recorre uno a uno para renombrar cada archivo de acuerdo con sus especificaciones (más información a continuación). Si es necesario, los archivos renombrados se mueven a una nueva ubicación, organizados en un directorio de nivel superior especificado por la ruta de archivo suministrada que apunta a una carpeta existente en su sistema. Los archivos se clasifican en subcarpetas etiquetadas por año, por ejemplo "1994"
. Si la subcarpeta no existe, se crea. Los archivos preexistentes se no sobreescrito en mis pruebas, pero esto puede depender de su versión de AppleScript y MacOS.
Utilizando este script: Puede copiar y pegar este script en script Editor y ejecutarlo desde allí. Hay cuatro propiedades definidas por el usuario cerca de la parte superior del script que puede (y debe) editar según sus necesidades:
-
rootdir
: La carpeta de nivel superior del árbol de directorios en la que se encuentran los archivos de imagen que se van a procesar. Los archivos pueden encontrarse en la propia carpeta de nivel superior o en cualquier subdirectorio que contenga. Debe ser una ruta posix (notación de barra oblicua), y utilizando una tilde ( ~
) para representar el directorio personal, al igual que una ruta de archivo completa.
-
imgTypes
: Una lista de extensiones de archivo (sin el punto inicial) que se utilizarán para discriminar los tipos de archivos que se procesarán. Todas las imágenes de sus capturas de pantalla tienen la extensión "tif"
por lo que puede dejar esta propiedad como está, o añadir extensiones adicionales si es necesario, por ejemplo. "gif"
.
-
moveFiles
: yes
para que los archivos se reubiquen en una sola carpeta después de ser renombrados; no
para dejarlos donde están (no ponga comillas alrededor de yes
o no
).
-
moveTo
: El directorio de destino al que se moverán las imágenes y se organizarán en subcarpetas después de cambiarles el nombre. Si moveFiles
se establece en no
, esta propiedad se ignora y no afectará a nada en el script. De lo contrario, la ruta suministrada debe ser, una vez más, una ruta posix a un archivo existente que puede sea igual a rootdir
o cualquier otra carpeta de su sistema. No es necesario que las subcarpetas para las imágenes existan de antemano, ya que el script las creará en función de las necesidades.
Algunas pautas de advertencia: Tenga en cuenta que este script utiliza Eventos del sistema para gestionar el cambio de nombre y el traslado de archivos. Por lo tanto, no hay deshacer.
A menos que tenga confianza con AppleScript (y específicamente con AppleScriptObjC) y las expresiones regulares (utilizadas para reformatear los nombres de archivo), le aconsejo que no edite usted mismo ninguna otra parte del script. Si lo hace, es probable que el script no funcione, lo que estaría bien, pero no es necesario. puede en lugar de eso terminará procesando y renombrando archivos que no era su intención, y usted no quiere eso.
Por esta razón, te sugiero que pruebes este script en un pequeño conjunto de archivos y carpetas ficticios para asegurarte de que hace lo que quieres antes de aplicarlo a tus archivos reales. También vale la pena hacer una copia de seguridad de sus fotografías de antemano, sólo para estar más seguro.
Dejando a un lado todas las advertencias, no preveo ningún problema si he entendido tus necesidades correctamente, y has entendido para qué está diseñado este script. Si no estás seguro, no dudes en pedir una aclaración.
Lo he probado en archivos con variaciones de nombre de archivo, y varias distribuciones a lo largo de un conjunto anidado de carpetas sin problemas. (Pero, naturalmente, esto sólo significa que no hay problemas en las condiciones que yo era capaz de pensar).
Cómo se renombran los archivos: Si se va a cambiar el nombre de un archivo, su nombre actual será debe contienen un número de seis cifras que representa una fecha del siglo XX en el formato ddmmyy
. Si hay más de una ocurrencia de un patrón numérico de seis dígitos en el nombre de archivo, es el primero que se supone que es la cadena de fecha. El resto del nombre del archivo puede ser cualquier cosa, tanto antes como después de la cadena de fecha, por ejemplo "%prefix% %ddmmyy% %suffix%.tif"
. Ni la parte del prefijo ni la del sufijo del nombre de archivo, ni los espacios, son obligatorios, por lo que un nombre de archivo formado simplemente por "%ddmmyy%.tif"
se considera válida para su tratamiento. A continuación, el nombre de archivo se reformatea intercambiando las posiciones del prefijo (si está presente) y la cadena de fecha, dejando el resto como está. La cadena de fecha también se reformatea al formato de fecha internacional estándar ISO, es decir yyyy-mm-dd
. Esto incluye los guiones (hágamelo saber si desea omitir los guiones, ya que sé que esto no era parte de su especificación original, pero es una práctica estándar de nombres de archivos tenerlos presentes). Para resumir el cambio de nombre de archivo mediante ejemplos:
"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"
Observe en el segundo ejemplo que el nombre de archivo ya podría haber sido formateado apropiadamente para empezar, sin embargo la presencia de un patrón numérico de seis dígitos significó que fue procesado por el script. Sin embargo, en el cuarto ejemplo, la ausencia de un patrón numérico de seis dígitos deja el nombre del archivo sin cambios.
1 votos
¿Cómo sabe que el
07
en130307
es1907
y no2007
? Además, sería útil ver una captura de pantalla de muestra de la estructura jerárquica de carpetas que muestre claramente los nombres de las carpetas y los archivos. Además, ¿están todas las carpetas de destino dentro de una carpeta y todos los archivos de destino en esas carpetas a una sola carpeta de profundidad?1 votos
@user3439894 buen punto, la lógica diría que no había archivos registrados en 1907 :)
0 votos
Buscar, La cámara ha existido desde 1816 y supongo que es concebible que las imágenes tiff que el OP tiene podrían ser digitalizados escaneos de fotos de 1907, acabo de escanear en un montón de fotos de un álbum de fotos WW2, así que esa es una de las razones por las que estoy pidiendo. Dicho esto, no voy a escribir ningún código para resolver el problema hasta que se proporcione la información solicitada en mi primer comentario.
0 votos
¿De cuántos archivos estamos hablando?
1 votos
Se trata de escaneados de los libros de actas de la Folk-Lore Society y el formato de los nombres refleja la fecha de 19XX (los escaneados llegan hasta 1999 coincidentemente). Como siempre, proporcione siempre el contexto completo.... @Buscar No tengo un recuento real, pero cada tif viene en alrededor de 19 mb y un conjunto de carpetas es de 15 gb de tamaño y otro conjunto es de 35 gb.
1 votos
¡! chiollaghbooks.com/temp/Legacy%201.jpeg
1 votos
¡! chiollaghbooks.com/temp/Legacy%202.jpeg
0 votos
Interesante, gracias. ¿Y por qué necesita la fecha en el nombre de archivo invertido?
0 votos
Al final queremos consolidar todos los archivos en una única carpeta anual, por lo que necesitamos poder ordenarlos. Los nombres de las carpetas son inviables tal como están, ya que no existe el orden del calendario. Yo no participé en este proyecto al principio, así que se trata de una lucha contra incendios a gran escala. Hay otros problemas, pero no están relacionados con la nomenclatura de los archivos.