Según la información en el OP y los comentarios, esto hará lo que usted solicitó.
En Automator :
Lo que hace el flujo de trabajo y el ejemplo AppleScript código :
- Encuentra todos los archivos PDF en la carpeta target , incluidas todas las subcarpetas.
- Esto se hace con la Búsqueda de elementos del Finder acción y su salida se pasa a la Ejecutar AppleScript acción .
- Crea una lista de todos los archivos PDF que se han modificado después de
creation date
, según el valor de la variable offsetInSeconds
.
- Esto se hace en el primer
repeat
loop . Los archivos que cumplen con los criterios se almacenan en modifiedFilesList
para ser usados en el siguiente repeat
loop .
- Crea una lista de todos los archivos que tienen anotaciones en Skim .
- Esto se hace usando
xattr
para obtener atributos extendidos de los archivos de destino. Si un archivo tiene el objetivo atributos extendidos , un indicador se establece en true
y, si no, se establece en false
. Los archivos marcados como true
van a annotatedSkimFilesList
para ser usados en el siguiente repeat
loop .
- Inserta en su lugar las anotaciones hechas a los archivos en Skim .
- Al usar la utilidad
skimpdf
dentro de Skim en los archivos en annotatedSkimFilesList
, las anotaciones están integradas en su lugar. Por lo tanto, no es necesario exportar a un segundo archivo, luego elimine el original y reemplácelo.
NOTA: Aunque he probado esto y funciona sin problema para mí, no lo ejecute hasta que esté seguro de que tiene una copia de seguridad adecuada. También debe probar el flujo de trabajo en una pequeña muestra de archivos copiados colocados fuera de la carpeta de búsqueda en la que se ejecutará el flujo de trabajo después de que se realicen las pruebas.
Ejemplo AppleScript código :
on run {input, parameters}
set skimpdfPathFilename to "'/Applications/Skim.app/Contents/SharedSupport/skimpdf'"
set offsetInSeconds to 60
set modifiedFilesList to {}
set annotatedSkimFilesList to {}
repeat with i from 1 to count input
set fileInfo to info for item i of input
set cDate to creation date in fileInfo
set mDate to modification date in fileInfo
if mDate > (cDate + offsetInSeconds) then
set end of modifiedFilesList to POSIX path of item i of input
end if
end repeat
repeat with i from 1 to count modifiedFilesList
set withNotes to (do shell script "xattr " & quoted form of item i in modifiedFilesList ¬
& " | [ $(grep -c \".*_notes$\") -ge 1 ] && printf 'true' || printf 'false'") as boolean
if withNotes then
set end of annotatedSkimFilesList to item i in modifiedFilesList
end if
end repeat
repeat with i from 1 to count annotatedSkimFilesList
do shell script skimpdfPathFilename & space & "embed" & space & ¬
quoted form of item i in annotatedSkimFilesList
end repeat
end run
Comprendiendo el comando do shell script
en el segundo repeat
loop:
Cuando un PDF está anotado en Skim y se guarda, atributos extendidos se configuran en el archivo, por ejemplo :
$ xattr Filename.pdf
com.apple.FinderInfo
net_sourceforge_skim-app_notes
net_sourceforge_skim-app_rtf_notes
net_sourceforge_skim-app_text_notes
$
La salida se canaliza |
a:
[ $(grep -c \".*_notes$\") -ge 1 ] && printf 'true' || printf 'false'
Lo que prueba la salida de grep
contando las ocurrencias del patrón y si grep
encuentra una o más ocurrencias del patrón , entonces el valor de la variable withNotes
se establece en true
, mientras que se establece en false
de lo contrario.
Tenga en cuenta que Skim tiene una utilidad de línea de comandos incorporada, por ejemplo. /Applications/Skim.app/Contents/SharedSupport/skimnotes
que se puede usar para probar si un PDF tiene anotaciones hechas en Skim , sin embargo, debido a su salida esta utilidad se usa mejor en un shell script ejecutado en Terminal y luego en do shell script
comando , y por qué usé xattr
y grep
en su lugar.
Nota: El ejemplo AppleScript código anterior es solo eso, y no incluye ningún manejo de errores como sea apropiado / necesario / deseado, la responsabilidad está en el usuario de agregar cualquier manejo de errores apropiado para cualquier código de ejemplo presentado o código escrito por uno mismo.