¿Duplicar y cambiar el nombre de la selección del Finder a la misma carpeta en un solo paso?

¿Es posible tal cosa? Tengo este código que puede hacer lo anterior:

set now to do shell script "date +%Y-%m-%d' '%H.%M.%S"
tell application "Finder"
    set finderSelList to selection as alias list
    try
        set fileDir to parent of first item of finderSelList as alias
    on error
        return "No selection"
    end try

    set dupeList to (duplicate finderSelList to fileDir) as list

    repeat with i from 1 to (count of dupeList)
        set ((dupeList)'s (item i)'s name) to ((finderSelList)'s (item i)'s name) & " [" & now & "]." & ((finderSelList)'s (item i)'s name extension)
    end repeat
end tell

return dupeList

Sin embargo, no es tan limpio, es decir, puede ver que los duplicados de los archivos se nombran <file name> 2.<file extension>y luego, un segundo después, se nombran como <file name> [date].<file extension>, lo cual es bastante chocante de ver.

Tengo una solución bash que es limpia (es decir, no discordante), pero usar Finder para copiar archivos tiene algunos beneficios (como barras de progreso, cancelar operaciones de copia, manejo diferente de xattr, etc.):

finderSelection=$(osascript getfinderselection.scpt)

now=$(date +%Y-%m-%d' '%H.%M.%S)

if [ "$finderSelection" ]
    then
    echo "$finderSelection" |
    while IFS= read -r file
    do
        fileDir=$(dirname "$file")
        fileBaseN=$(basename "$file")
        fileName="${fileBaseN%.*}"
        fileExt="${fileBaseN##*.}"

        cp -r "$file" "$fileDir/[$now] $fileName.$fileExt"
    done

    afplay "/System/Library/Components/CoreAudio.component/Contents/SharedSupport/SystemSounds/system/Volume Mount.aif"

fi

...y getfinderselection.scpt contiene:

tell application "Finder"
    set finderSelList to selection as alias list
end tell

if finderSelList ≠ {} then
    repeat with i in finderSelList
        set contents of i to POSIX path of (contents of i)
    end repeat

    set AppleScript's text item delimiters to linefeed
    finderSelList as text
end if

En esta implementación, cuando bash duplica los archivos, no ve ningún paso intermedio en el que se cambie el nombre de los archivos. No, cuando se generan los duplicados, sus nombres de archivo ya están finalizados.

Entonces...

  • ¿Hay alguna manera de implementar la idea en AppleScript pero que no sea tan discordante y mucho más suave, como lo hace bash?
  • En primer lugar, ¿debería ejecutar con la solución AppleScript o bash?
  • ¿De qué otra manera se puede mejorar la solución preferida? Para la solución de AppleScript, necesito encontrar una manera de eliminar la extensión de archivo de ((finderSelList)'s (item i)'s name), y también eliminar el seguimiento .cuando se trata de carpetas. Para la solución bash, las salidas fileName y fileExt, especialmente para las carpetas, pueden ser inesperadas y desordenadas.

Respuestas (1)

Para su solución AppleScript, puede duplicar en un directorio temporal (preferiblemente en el mismo sistema de archivos), luego cambiarles el nombre al directorio original. Traté de arreglar esto para ti, pero me di por vencido...

Si desea una alternativa, en lugar de bash, puede consultar esta respuesta https://stackoverflow.com/a/275945/1942837 que proporciona (presumiblemente) una buena interfaz gráfica de usuario de python con progreso (no he probado esto).