¿Duplicar y renombrar la selección del Finder a la misma carpeta en un solo paso?

4

¿Es tal cosa posible? 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 está tan limpio, es decir, puedes ver que los duplicados de los archivos se llaman <file name> 2.<file extension> , y luego un segundo más tarde recibe el nombre de <file name> [date].<file extension> , lo cual es bastante sorprendente.

Tengo una solución bash que está limpia (es decir, no discordante), pero usar el Finder para copiar archivos tiene algunos beneficios (como barras de progreso, cancelación de 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 forma de implementar la idea en AppleScript pero no es tan arrolladora y mucho más sencilla, como la de bash?
  • En primer lugar, ¿debo ejecutar la solución AppleScript o bash one?
  • ¿De qué otra manera se puede mejorar la solución preferida? Para la solución AppleScript, necesito encontrar una manera de eliminar la extensión de archivo de ((finderSelList)'s (item i)'s name) , y también eliminar el . final cuando se trata de carpetas. Para la solución de bash, las salidas fileName y fileExt, especialmente para las carpetas, pueden ser inesperadas y desordenadas.
pregunta Anonymous 17.12.2015 - 15:19

1 respuesta

1

Para su solución de AppleScript, puede duplicar en un directorio temporal (preferiblemente en el mismo sistema de archivos), y luego cambiar su nombre al directorio original. Traté de piratear esto juntos por ti, pero me rendí ...

Si desea una alternativa, en lugar de bash puede buscar en esta respuesta enlace que proporciona una (probablemente) buena python gui con progreso (no he probado esto).

    
respondido por el oystein 31.12.2015 - 12:33

Lea otras preguntas en las etiquetas