1 votos

Cambio de estructura de AppleScript creado carpetas basado en la fecha

Tengo un AppleScript que ha sido escrito y funciona como tal, pero necesito cambiar la forma en que se crea la estructura de carpetas. El script hace lo siguiente:

  • Se selecciona la carpeta que contiene los archivos (en mi caso será el de las fotos).
  • A continuación, le mira las fotos de la fecha.
  • Crear una AAAA (Año de la carpeta si no ya creado).
  • Crear una MM (Mes de la carpeta si no ya creado).
  • Crear un DD (Día de la carpeta si no ya creado).
  • Luego mover la foto dentro de esta carpeta y repita el procedimiento para la foto siguiente y repita hasta que haya completado.

La actual estructura de la carpeta se crea de la siguiente manera:

2018 "YYYY"
├── 2018-01 "MM"
├── 2018-02

Esto es genial y funciona como fue diseñado, pero he cambiado mi mente en cómo me gustaría que las carpetas se parecen. Me gustaría tener la siguiente estructura (que es casi la misma solo una nomenclatura diferente estructura:

2018
├── 001 January
│   ├── 20180101
│   └── 20180102
├── 002 February
│   ├── 20180201
│   └── 20180202
└── 003 March
    ├── 20180301
    └── 20180302

Ahora he intentado averiguar donde se genera la secuencia de comandos de esto, pero me han fallado, así que ahora estoy volviendo a este gran lugar para un poco de ayuda.

on run
    SortFiles(POSIX path of (choose folder))
end run

on open (DroppedFolder)
    set DroppedFolder to POSIX path of DroppedFolder
    if text (length of text of DroppedFolder) of DroppedFolder is not "/" then quit
    SortFiles(DroppedFolder)
end open

on SortFiles(SortFolder)
    set AppleScript's text item delimiters to return
    set SortFolderContents to the text items of (do shell script "find '" & SortFolder & "' -type f")
    set FolderMakeList to {}
    repeat with ThisItem in SortFolderContents
        set ThisFile to ThisItem as string
        if ThisFile does not contain "/." then
            tell application "Finder"
                set DateString to text 1 thru 7 of ((creation date of ((POSIX file ThisFile) as alias)) as «class isot» as string)
                set ThisFilesFolder to SortFolder & text 1 thru 4 of DateString & "/"
                set ThisFilesSubfolder to ThisFilesFolder & text 1 thru 7 of DateString & "/"
            end tell
            if ThisFilesFolder is not in FolderMakeList then
                try
                    do shell script ("mkdir '" & ThisFilesFolder & "'")
                end try
                set FolderMakeList to FolderMakeList & ThisFilesFolder
            end if
            if ThisFilesSubfolder is not in FolderMakeList then
                try
                    do shell script ("mkdir '" & ThisFilesSubfolder & "'")
                end try
                set FolderMakeList to FolderMakeList & ThisFilesSubfolder
            end if
            try
                do shell script ("mv '" & ThisFile & "' '" & ThisFilesSubfolder & "'")
            end try
        end if
    end repeat
    return FolderMakeList
end SortFiles

3voto

qarma Puntos 71

La parte de la secuencia de comandos que los nombres de las carpetas es esta línea:

set ThisFilesFolder to SortFolder & (do shell script ("date -r " & ThisFilesEpoch & " \"+%b-%Y\"")) & "/"

Sin embargo, en mi breve examen de la secuencia de comandos, no aparece para crear la estructura de carpetas que se describe en absoluto, que no es una sorpresa para mí, dado que el comando de shell se utiliza para generar la cadena de fecha desde la que la carpeta se llama es este:

date -r %time% "+%b-%Y"

donde %time% se inserta por medio de la variable ThisFilesEpoch y representa el número de segundos desde la Época (1 de enero de 1970) que el archivo (o, más bien, su inode) fue creado. Esta función shell, date, se toma este valor (un entero grande), que se entiende como un valor en "tiempo de Unix", y re-formatos utilizando una representación canónica dada por los tokens %b (que representa una abreviatura de tres letras para el mes) y %Y (que representa un número de cuatro dígitos para el año).

Así, por ejemplo:

date -r 1534615274 "+%b-%Y"

devuelve:

Aug-2018

en la que los archivos a partir de agosto de 2018 que yo tenía en mi carpeta elegida fueron trasladados. No crear otro día-de-la-mes carpetas, ni incluso por separado año carpetas; sólo "month-year" carpetas. Así que estoy confundido que parecen haber descrito lo que podría ser un script diferente por completo.

El guión también tiene una serie de cualidades que irk mí un gran interés, tales como:

  1. Sus perezosos uso de try...end try;

  2. La inserción de los literales entre comillas simples rodea de una variable se utiliza como parte de una cadena, por ejemplo,

    do shell script "find '" & SortFolder & "' -type f" 
    

    en lugar de

    do shell script "find " & quoted form of SortFolder & " -type f" 
    
  3. Esta extraña formulación:

    if text (length of text of DroppedFolder) of DroppedFolder is not "/" then...
    

    lo que podría ser escrito como

    if text -1 of DroppedFolder is not "/" then...
    

    o como

    if the last character of DroppedFolder is not "/" then...
    

    o incluso

    if DroppedFolder does not end with "/" then...
    
  4. Y el uso repetido de do shell script, que es fina como una herramienta de comandos que se invoca, pensativa, cuando sea necesario, pero cuando se rellena el guión tan densamente como este, uno se pregunta por qué la secuencia de comandos no fue escrito como un shell/bash script, para empezar. También es muy costoso en términos de sobrecarga para crear y destruir shell procesos, uno tras otro como este script no.

Dadas estas estilística y funcional desventajas, además de la confusión sobre lo que la secuencia de comandos se supone debe hacer en la actualidad frente a lo que en realidad parece que hacer, sentí que valía la pena volver a escribir:

use Finder : application "Finder"
property rootdir : missing value

# The default run handler when run within Script Editor
on run
    using terms from scripting additions
        set root to choose folder
    end using terms from
    set rootdir to Finder's folder root                         -- '
    sortFiles()
end run

# Processes items dropped onto the applet.  The handler expects one or more 
# file references in the form of an alias list, and will process each item in 
# the list in turn.  If an item is not a folder reference, it is ignored.
# For the rest, the contents of each folder is reorganised.
on open droppedItems as list
    repeat with drop in droppedItems
        set rootdir to Finder's item drop
        if rootdir's class = folder then sortFiles()
    end repeat
end open

# Obtains every file in the root directory and all subfolders, moving them
# to new folders nested within the root directory and organised by year, month,
# and date of each file's creation
to sortFiles()
    repeat with f in the list of fileitems()
        set [yyyy, m, dd] to [year, month, day] of (get ¬
            the creation date of Finder's file f)               -- '

        set mmm to text -3 thru -1 of ("00" & (m * 1)) -- e.g. "008"
        set mm to text -2 thru -1 of mmm -- e.g. "08"
        set dd to text -2 thru -1 of ("0" & dd) -- e.g. "01"

        (my newFolderNamed:yyyy inFolder:rootdir)
        (my newFolderNamed:[mmm, space, m] inFolder:result)

        move Finder's file f to my newFolderNamed:[yyyy, mm, dd] ¬
            inFolder:result                                     -- '
    end repeat
end sortFiles

# A handler to house a script object that enumerates the contents of a 
# directory to its full depth
on fileitems()
    script
        property list : every document file in the ¬
            entire contents of the rootdir ¬
            as alias list
    end script
end fileitems

# Creates a new folder with the supplied name in the specified directory, 
# checking first to see whether a folder with that name already exists.  
# In either case, a Finder reference to the folder is returned.
to newFolderNamed:(dirname as text) inFolder:dir
    local dirname, dir

    tell (a reference to folder dirname in the dir) ¬
        to if it exists then return it

    make new folder at the dir with properties {name:dirname}
end newFolderNamed:inFolder:

Yo les insto a probar esta secuencia de comandos en un principio en una prueba de directorio que contiene los archivos de ejemplo. De hecho, el peor escenario es el mismo que con su actual script, el cual es la situación en la que usted elija el directorio equivocado por error. Suponiendo que el directorio correcto está seleccionado, entonces el peor escenario es que los archivos no se moverán, por lo tanto, es un lugar muy seguro de secuencia de comandos.

Me re-escribió el open controlador demasiado, que (con suerte) le permiten atender a varios elementos que se cayó en el applet. Esto significa que usted podría, por ejemplo, la caída de dos carpetas en ella y tiene tanto contenido de las carpetas re-estructurado. Sin embargo, yo no he probado esto. De nuevo, el escenario del peor caso aquí es que no hacer nada, que será el caso si estoy equivocado acerca de qué tipo de archivo de referencia se pasa a la open de controlador (supongo que será alias objetos).

0voto

trejder Puntos 183

Cambia el% b,% Y etc

Aquí hay una clave: http://man7.org/linux/man-pages/man1/date.1.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