Conformément aux informations dans le message original et aux commentaires, ceci sera fait comme demandé.
Dans Automator:
Ce que le Workflow et le code AppleScript exemple font:
- Recherche tous les fichiers PDF dans le dossier cible, y compris tous les sous-dossiers.
- Cela se fait avec l'action Rechercher des éléments du Finder et sa sortie est transmise à l'action Exécuter un script Apple.
- Crée une liste de tous les fichiers PDF qui ont été modifiés après la
date de création
, en fonction de la valeur de la offsetInSeconds
variable.
- Cela se fait dans la première
répétition
boucle. Les fichiers répondant aux critères sont stockés dans modifiedFilesList
pour être utilisés dans la prochaine répétition
boucle.
- Crée une liste de tous les fichiers pour lesquels des annotations ont été faites dans Skim.
- Cela se fait en utilisant
xattr
pour récupérer les attributs étendus des fichiers cibles. Si un fichier possède les attributs étendus cibles, un drapeau est défini sur true
et s'il ne l'a pas, il est défini sur false
. Les fichiers marqués comme true
vont dans annotatedSkimFilesList
pour être utilisés dans la prochaine répétition
boucle.
- Intègre les annotations effectuées sur les fichiers dans Skim.
- En utilisant l'utilitaire
skimpdf
dans Skim sur les fichiers dans annotatedSkimFilesList
, les annotations sont intégrées sur place. Ainsi, pas besoin d'exporter vers un deuxième fichier, puis de supprimer l'original et de le remplacer.
REMARQUE: Bien que j'ai testé ceci et qu'il fonctionne sans problème pour moi, ne l'exécutez pas avant d'être sûr d'avoir une sauvegarde appropriée! Vous devriez également tester le flux de travail sur un petit échantillon de fichiers copiés placés en dehors du dossier de recherche réel sur lequel le flux de travail sera exécuté après que les tests sont effectués.
Exemple code AppleScript exemple :
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
Compréhension de la do shell script
commande dans la deuxième répétition
boucle:
Lorsqu'un PDF est annoté dans Skim et enregistré, des attributs étendus sont définis sur le fichier, par exemple:
$ xattr NomDuFichier.pdf
com.apple.FinderInfo
net_sourceforge_skim-app_notes
net_sourceforge_skim-app_rtf_notes
net_sourceforge_skim-app_text_notes
$
La sortie est pipée |
vers:
[ $(grep -c \".*_notes$\") -ge 1 ] && printf 'true' || printf 'false'
Cela teste la sortie de grep
en comptant les occurrences du patron et si grep
trouve une ou plusieurs occurrences du patron, alors la valeur de la withNotes
variable est définie sur true
, tandis qu'elle est définie sur false
sinon.
Remarquez que Skim a un utilitaire en ligne de commande intégré, par exemple /Applications/Skim.app/Contents/SharedSupport/skimnotes
qui peut être utilisé pour tester si un PDF contient des annotations faites dans Skim, cependant en raison de sa sortie cet utilitaire est mieux utilisé dans un script shell exécuté dans Terminal puis une do shell script
commande, et c'est pourquoi j'ai utilisé xattr
et grep
à la place.
Note: Le code AppleScript exemple ci-dessus est simplement cela, et ne comprend pas de gestion des erreurs comme cela peut être approprié/nécessaire/souhaité, la responsabilité incombe à l'utilisateur d'ajouter toute gestion des erreurs appropriée pour tout code exemple présenté et/ou code écrit par l'utilisateur lui-même.
0 votes
Qu'est-ce que vous souhaitez faire avec les fichiers PDF trouvés qui répondent aux critères? Je demande car en utilisant Automator, il a trouvé, en 2,5 secondes, les 108 fichiers PDF parmi les 1 181 de mon dossier Documents qui ont été modifiés après leur création. Je peux vous donner le flux de travail dans une réponse, mais en sachant comment vous voulez les informations et/ou ce que vous voulez faire avec les fichiers trouvés, je pourrais étendre le flux de travail avant de le publier.
0 votes
@user3439894 Idéalement, je pourrais avoir un flux de travail complet qui a) trouve tous les PDF modifiés (c'est-à-dire, avec des annotations Skim), b) les exporte avec des notes intégrées (ce qui rendra les annotations lisibles dans Aperçu, PDFpen, etc.), c) supprime le PDF original, et d) conserve le PDF nouvellement converti dans le même emplacement de dossier que celui qu'il a remplacé. Ou si Finder me montre simplement les PDF modifiés, je pourrais prendre les choses en main, bien que de manière moins efficace. J'ai déjà un droplet qui fait l'exportation avec des notes intégrées... J'ai juste besoin d'un moyen d'identifier les fichiers modifiés. J'espère que cela a du sens.
0 votes
D'accord, je pars pour la soirée donc je n'ai pas le temps de faire tout ce qui a été présenté dans votre commentaire, donc je vais publier les informations que j'ai et vous pouvez voir si vous pouvez les améliorer, car je n'aurai pas de temps avant demain (selon l'heure à laquelle je reviendrai ce soir). Dans Automator, créez un nouveau flux de travail et ajoutez une action Rechercher des éléments du Finder avec les paramètres, par exemple, Recherche (Documents) > (Tout) > (Type)(est)(PDF). Ajoutez une action Exécuter un script Apple, remplacez le code par défaut par le code AppleScript suivant, que vous devez d'abord exécuter comme une commande dans Terminal pour le diviser en lignes de code individuelles:
0 votes
printf '\nà l'exécution {entrée, paramètres}\nset listeFichiersModifiés to {}\nrépéter avec i de 1 à dénombrer entrée\nset infoFichier à infos pour l'élément i de l'entrée\nset cDate à date de création dans infoFichier\nset mDate à date de modification dans infoFichier\nif mDate > cDate then\nset fin de listeFichiersModifiés à élément i de l'entrée\nend if\nfin répéter\nretourner listeFichiersModifiés\nend exécution\n\n'
Ensuite copiez et collez depuis Terminal vers l'action Exécuter un script AppleScript. Notez que tel que codé, il transmet les listes de fichiers modifiés depuis la création vers l'action suivante dans le flux de travail, ou vous pouvez étendre le code AppleScript exemple pour faire quelque chose d'autre.0 votes
Merci pour l'aide. Tout d'abord, c'est incroyable. Cependant, il y a de nombreux fichiers que je n'ai jamais annotés, mais il semble néanmoins que la date de modification est quelques secondes plus tard que la date de création (je viens de découvrir comment afficher les secondes dans Finder). Y a-t-il un moyen de modifier le script pour ne lister que les fichiers dont la différence entre la date de modification et la date de création est de plus de 30 secondes environ ? Merci beaucoup pour l'aide.
0 votes
J'ai aussi joué avec ça. Incroyable! Trouvé le même problème. Il suffit de le changer pour dire mDate > cDate + 60 (les unités sont en secondes).
0 votes
Que faire avec les résultats? J'ai ajouté une action Automator pour ajouter une étiquette de couleur inutilisée à chaque fichier. Vous pouvez ensuite les obtenir tous dans une recherche Finder. Dommage que vous ne puissiez pas trier par chemin.
0 votes
Je ne sais pas si vous avez vu ma réponse ou non, cependant je viens de la mettre à jour, donc merci de la relire.