1 votos

Necesito script o app para convertir nombres de archivos y carpetas de orden día/mes/año a año/mes/día.

Recientemente me han enviado un gran número de archivos tif en los que, por alguna razón equivocada, los nombres de archivo se han registrado en formato DD/MM/AA, es decir, 130307, mientras que yo lo necesito como AAAA MM DD. Los archivos también tienen prefijos como se muestra aquí: GC Mins 130307 004.tif (esto puede permanecer aunque la oportunidad de modificarlo también sería bienvenida).

Los archivos se encuentran en carpetas con nombres similares: 07 Dic 08 Ene 13 oct

También hay que convertirlos para que se lean aaaa mm dd.

Agradeceré cualquier ayuda sobre qué hacer para solucionar este problema, ya que el renombrado por fuerza bruta no es realmente posible dado el número de archivos, que asciende a miles.

1 votos

¿Cómo sabe que el 07 en 130307 es 1907 y no 2007 ? 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.

2voto

qarma Puntos 71

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:

  1. 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.

  2. 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" .

  3. 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 ).

  4. 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

@Stephen 8f this answered your question you should mark it as the accepted answer

0voto

moodforaday Puntos 2633

Recomiendo encarecidamente descargar Nombre Mangler por Muchos Trucos.

Soy perfectamente capaz de escribir scripts para renombrar archivos/carpetas, pero en su lugar uso Name Mangler. ¿Por qué?

Por tres razones:

  1. Name Mangler le ofrecerá una vista previa del aspecto que tendrán los archivos una vez que haya realizado los pasos de renombrado (y los scripts de renombrado pueden tener cualquier tipo de regex que necesite).

  2. Name Mangler te permitirá encadenar varios pasos, si es necesario.

  3. Name Mangler te permitirá deshacer cambios, si algo va mal.

Sin relación con la empresa, sólo un cliente satisfecho.

0 votos

Gracias. He mirado en Name Mangler, así como FileRenamer que ofrece la misma funcionalidad, pero ambos no va a hacer lo que se necesita. Mientras que para mí 130307 es 1907 03 13 a estos programas es sólo seis dígitos en una fila y ninguna de las operaciones de tiempo / fecha / año trabajará en el nombre del archivo en sí, así.

0 votos

A Better Finder Rename hace exactamente lo que se necesita. publicspace.net/ABetterFinderRename/index.html

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X