Comment préserver les horodatages JPEG lors de la mise à l'échelle d'Automator?

3

Les services Automator intégrés dans un menu contextuel sont un excellent moyen de réduire rapidement les fichiers JPEG dans le viseur. Faites un clic droit sur le fichier, choisissez votre script de mise à l'échelle, en quelques secondes. Le problème est que cela efface les horodatages des fichiers en les écrasant avec la date de l'opération de mise à l'échelle.

Existe-t-il un moyen d'utiliser Automator pour conserver les horodatages lors de la mise à l'échelle?

Sinon, dans Automator, existe-t-il un meilleur moyen de le faire?

Exemple de service de redimensionnement JPEG créé avec Automator

SeanJ
la source
Si vous modifiez un fichier, son horodatage est censé changer, ce qui est un comportement tout à fait normal!
user3439894
Comme d'autres l'ont souligné, la date de modification changera. J'utilise un programme (gratuit) en ligne de commande pour copier les dates Exif du jpegchamp Date. J'ai également un script Automator pour le faire qui consiste en un bashscript simple jhead -ft "$*". Si vous voulez cette recherche jhead.
Milliways
Bonjour Milliways, cette solution est encore plus simple que le script que j'avais en tête. J'ai cherché et découvert que je pouvais consulter les informations EXIF ​​à l'aide du logiciel Photos ou de l'option Obtenir des informations (Cmd + I) sous Autres, bien que la date ne soit pas indiquée séparément. J'ai trouvé le programme Jhead de Matthias Wandel .
SeanJ
@SeanJ, j'ai modifié le code afin de combiner les commandes SetFile pour ne l'appeler qu'une fois en utilisant les indicateurs -met -den même temps. (Vous auriez dû le faire en premier lieu). Vous voudrez peut-être donc mettre à jour le service Automator que vous avez téléchargé. De plus, si vous laissiez des espaces et une indentation dans le code, je vous en serais reconnaissant, car cela simplifie la lecture et la compréhension. L'espace blanc ne ralentit pas l'exécution.
user3439894

Réponses:

3

Voici un moyen d’atteindre l’objectif déclaré avec un service Automator . Au lieu d'utiliser Scale Images, utilisez Run Shell Script avec les paramètres, Shell: / bin / bash et Pass input: As arguments et ajoutez-y le code suivant :

for f in "$@"; do

        # Get the creation date time stamp of the target file, saved as 't'.

    t="$(/usr/bin/GetFileInfo -d "$f")"

        # Get the pixel width of the target file and divide it by 2 for a 50% scaling, saved as 'w'.

    w="$(/usr/bin/sips -g pixelWidth "$f" | /usr/bin/grep pixelWidth | /usr/bin/awk '{print $2/2}')"

        # Scale the target file.

    /usr/bin/sips --resampleWidth $w "$f"

        # Set the modified and creation date time stamps of the target file to the saved value held in 't'.

    /usr/bin/SetFile -m "$t" -d "$t" "$f"

done
        # Notify User operation is finished.
/usr/bin/afplay "/System/Library/Sounds/Purr.aiff"

Notez que la dernière ligne du code ci-dessus peut être omise si vous allez utiliser Show Growl Notification , que je n'ai pas et pourquoi j'ai utilisé un son système. Cela a été fait sous OS X 10.8.5 et vous devrez vérifier que le chemin d'accès aux exécutables est le même sur votre système, même s'il devrait l'être. La raison pour laquelle j'utilise le chemin d'accès complet de chaque exécutable est due aux erreurs d'Automator si je ne les ai pas. Vous pouvez obtenir le FQP dans un terminal en utilisant which, par exemple, des which sipsdéclarations /usr/bin/sips.

Notez que GetFileInfoet SetFilefont partie des outils Xcode et si non vous avez déjà installé vous devez installer, qui peut être déclenché en tapant GetFileInfodans un terminal et par la suite avec les invites.

Vous pouvez lire les pages de manuel de chacune des commandes utilisées pour mieux comprendre ce qui se passe.

Les pages de manuel pour: GetFileInfo , gorgées et SetFile

Service Automator

utilisateur3439894
la source
Excellent script! J'ai joué un peu avec des gorgées mais je n'ai pas réussi à 50%. Une belle solution. Après l'avoir vu, ça a toujours l'air si simple. Merci beaucoup.
SeanJ
@ les autres utilisateurs souhaitant utiliser ce script sans le créer eux-mêmes, téléchargez le fichier ZIP et placez-le dans le dossier Services (généralement / Utilisateurs / votre_utilisateur / Bibliothèque / Services /). Commencez par cliquer avec le bouton droit sur une image dans le Finder et en sélectionnant le script dans le sous-menu Services. Gardez à l'esprit que, comme user343 .. l'a dit, vous avez besoin des outils Xcode et vous devez éventuellement ajuster les chemins dans le script.
SeanJ
@ SeanJ, vous dites que vous avez joué avec sipsavant d'avoir vu ma réponse et que vous ne pouviez pas la faire fonctionner? Je demande parce que le script tel qu’il sipsest écrit correspond à la moitié de la largeur en pixels du fichier original, ce $wqui a toujours fonctionné dans mes tests.
user3439894
0

Le système de fichiers sous Mac OS X conserve 3 horodatages distincts pour les fichiers, comme suit:

ctime - heure de changement (heure de dernier changement du propriétaire du fichier, autorisations

atime - heure d'accès (date du dernier accès au fichier ou au contenu)

mtime - Heure de modification (date à laquelle le contenu réel a été modifié pour la dernière fois)

Bien que ceux-ci soient définis automatiquement au cours des différentes étapes de la vie d'un fichier au cours d'une interaction normale, il est important de comprendre qu'ils sont également modifiables en une valeur (valide) de votre choix. Vous pouvez écraser la dernière heure modifiée sur une date précédente, si vous en avez vraiment besoin, etc. avec une simple commande de terminal:

StuffeMac:~ stuffe$ touch dan.txt
StuffeMac:~ stuffe$ ls -l dan.txt
-rw-r--r--  1 stuffe  staff  0  3 Jan 22:30 dan.txt
StuffeMac:~ stuffe$ touch -mt 201601022359 dan.txt
StuffeMac:~ stuffe$ ls -l dan.txt
-rw-r--r--  1 stuffe  staff  0  2 Jan 23:59 dan.txt
StuffeMac:~ stuffe$ 

Donc, tout ce que vous avez à faire est de lire l’heure que vous souhaitez enregistrer, d’apporter vos modifications, puis de revenir à l’heure originale. Tout cela peut être fait dans Automator.


Je ne vous laisserai pas le temps, mais voici un moyen rapide et sale (avec beaucoup de commentaires et de vérifications pour vous assurer de bien comprendre, et ce n’est pas simplement une charge de terminal commandes) pour lire un horodatage, le stocker dans un fichier pour plus tard, puis réappliquer le même horodatage en utilisant la ligne de commande.

Vous devriez pouvoir les enregistrer en tant que scripts courts modifiés pour accepter le nom de fichier fourni par Automator), puis appeler ces scripts en tant qu'actions individuelles de Automator.


La chose la plus délicate est de capturer toute la chaîne de date en une fois, car vous pouvez voir les changements de format et vous perdez du temps pour afficher l’année pour les anciens fichiers (et comme nous venons de passer à 2016, presque tous vos fichiers montrera simplement 2015 au lieu de l'horodatage si vous utilisez ls...

drwxr-xr-x+   5 stuffe  staff   170  3 May  2015 Public
-rw-r--r--    1 stuffe  staff     0  2 Jan 23:59 dan.txt

... Vous pouvez donc utiliser d'autres commandes, comme à la getfileinfoplace:

StuffeMac-6:~ stuffe$ getfileinfo -m Public
05/03/2015 13:07:33
StuffeMac-6:~ stuffe$ getfileinfo -m dan.txt
01/02/2016 23:59:00

Donc, sans plus tarder, voici un horrible bidouillage que quelqu'un peut améliorer:

Etape 1 , lisez l’horodatage et stockez-le dans une variable, ainsi que dans un fichier afin que nous puissions le récupérer plus tard.

Configurez le fichier et donnez-lui une heure de modification plus ancienne comme s'il s'agissait d'un ancien fichier et répertoriez l'heure de modification pour prouver:

StuffeMac-6:~ stuffe$ touch originalfile.txt
StuffeMac-6:~ stuffe$ touch -mt 201506051200 originalfile.txt
StuffeMac-6:~ stuffe$ ls -l originalfile.txt
-rw-r--r--  1 stuffe  staff  0  5 Jun  2015 originalfile.txt
StuffeMac-6:~ stuffe$ getfileinfo -m originalfile.txt
06/05/2015 12:00:00

Maintenant, nous lisons l’horodatage et passons-le par une commande appelée awkplusieurs fois pour effacer l’espace de l’horodatage et le remplacer par un signe deux-points, puis en utilisant /et :comme délimiteurs, imprimez la date dans le format requis par Touchez la commande plus tard ( c'est un peu méchant, mais essentiellement le premier passage sans un délimiteur fourni utilise un espace par défaut, que je remplace par deux points, de sorte que le prochain passage qui délimite spécifiquement :fonctionne correctement - je ne pouvais pas l'obtenir d'utiliser un espace et : et /en un seul passage ... - mais la lisibilité était plus importante que l' efficacité ). Écho de la variable pour prouver que vous l'avez créée correctement, puis videz-la dans un fichier afin de l'avoir plus tard, lisez le fichier pour le prouver:

StuffeMac-6:~ stuffe$ origtimestampvariable=`getfileinfo -m originalfile.txt | awk '{print $1":"$2}'|awk -F[/:] '{print $3$2$1$4$5}'`
StuffeMac-6:~ stuffe$ echo $origtimestampvariable
201505061200
StuffeMac-6:~ stuffe$ echo $origtimestampvariable > origtimestampvariable.txt
StuffeMac-6:~ stuffe$ more origtimestampvariable.txt
201505061200

Étape 2 Maintenant, modifiez le fichier.

Ici, je viens d’ajouter du texte, mais votre Automator ferait ce travail ici, puis imprimerait les temps modifiés modifiés pour prouver que le changement avait eu lieu:

StuffeMac-6:~ stuffe$ echo "making changes to the file now to change modified time" >> originalfile.txt
StuffeMac-6:~ stuffe$ ls -l originalfile.txt
-rw-r--r--  1 stuffe  staff  55  3 Jan 23:17 originalfile.txt
StuffeMac-6:~ stuffe$ getfileinfo -m originalfile.txt
01/03/2016 23:17:05

Étape 3 Remettez l'ancien horodatage

Maintenant, réinitialisez l'horodatage modifié, en utilisant le fichier tactile comme indiqué en haut de cette réponse, mais en automatisant le bit où nous incluons la date pour inclure le contenu du fichier que nous connaissons maintenant, inclut l'horodatage dont nous avons besoin dans le format correct:

StuffeMac-6:~ stuffe$ touch -mt `cat origtimestampvariable.txt` originalfile.txt

Quelques vérifications supplémentaires pour prouver que l'horodatage d'origine est en place:

StuffeMac-6:~ stuffe$ ls -l originalfile.txt
-rw-r--r--  1 stuffe  staff  55  6 May  2015 originalfile.txt
StuffeMac-6:~ stuffe$ getfileinfo -m originalfile.txt
05/06/2015 12:00:00
farcir
la source
Salut Stuffe, merci pour l'explication détaillée. Je suis toujours un utilisateur novice de Terminal mais je me suis débrouillé avec votre procédure pas à pas. Pour le rétrécissement régulier des photos, je vais utiliser Automator car le décalage horaire avec bash va s’additionner.
SeanJ
0

Il est possible de le faire sans avoir à télécharger Xcode.

Avec la sipscommande dans l'action " Run Shell Script " pour remplacer l'action " Scale Images ".

Le script utilise la statcommande pour obtenir les dates de création et de modification du fichier et la touchcommande pour modifier les dates du fichier.

Le script bash:

for f in "$@"
do
    newSize=$(sips -g pixelWidth -g pixelHeight "$f" | awk 'BEGIN{max=0} /pixel/{if(max<$NF){max=$NF}} END{print max/2}')
    if [ $newSize != "0" ]; then
        tDates=($(stat -f "%SB %Sm" -t "%Y%m%d%H%M.%S" "$f"))
        sips -Z $newSize -s formatOptions 95 "$f" && touch -t ${tDates[0]} "$f" && touch -t ${tDates[1]} "$f"
    fi
done

Vous pouvez changer la qualité (le nombre after -s formatOptions) 0-100 , la valeur par défaut est 80 .

100 = la meilleure qualité et un fichier plus volumineux, 0 = une qualité médiocre et un fichier plus volumineux .

jackjr300
la source
Bonne réponse, bien que comme écrit, il échoue avec syntax error near unexpected token ('et tDates =($(stat -f "%SB %Sm" -t "%Y%m%d%H%M.%S" "$f"))'donc vous devez supprimer l'espace tDates =. De plus, vous n'avez pas besoin de télécharger Xcode. Les outils Xcode et Xcode sont deux choses différentes et de taille assez différente. Xcode est supérieur à 4 Go et Xcode Tools à moins de 200 Mo. C'est bien d'avoir une solution native aussi.
user3439894