Wie bleiben JPEG-Datumsstempel während der Automator-Skalierung erhalten?

Als Kontextmenü eingebettete Automator-Dienste sind eine großartige Möglichkeit, JPEGs im Finder schnell zu verkleinern. Klicken Sie mit der rechten Maustaste auf die Datei, wählen Sie Ihr Skalierungsskript aus, fertig in Sekunden. Das Problem ist, dass die Datumsstempel der Dateien gelöscht und mit dem Datum des Skalierungsvorgangs überschrieben werden.

Gibt es eine Möglichkeit, Automator zu verwenden, um Datumsstempel während der Skalierung beizubehalten?

Wenn nicht in Automator, gibt es eine bessere Möglichkeit, dies zu tun?

Mit Automator erstellter Beispiel-JPEG-Skalierungsdienst

Wenn Sie eine Datei ändern, sollte sich ihr Datums-/Zeitstempel ändern, und das ist ein ganz normales Verhalten!
Wie andere bereits angemerkt haben, wird sich das Änderungsdatum ändern. Ich verwende ein (kostenloses) Befehlszeilenprogramm, um die Exif-Daten aus dem jpegin das Datumsfeld zu kopieren. bashIch habe auch ein Automator-Skript, um dies zu tun, das aus dem einfachen Skript besteht jhead -ft "$*". Wenn Sie diese Suche nach jhead.
Hallo Milliways, diese Lösung ist noch einfacher als das Skript, das ich im Sinn hatte. Ich habe mich umgesehen und festgestellt, dass ich die EXIF-Informationen mit der Fotos-Software oder mit Get Info (Cmd + I) unter More überprüfen kann, obwohl das Datum dort nicht separat aufgeführt ist. Ich habe das jhead-Programm von Matthias Wandel gefunden .
-m@SeanJ, ich habe den Code bearbeitet, um SetFile-Befehle zu kombinieren, um ihn nur einmal mit den Flags und -dgleichzeitig aufzurufen . (Hätte es von Anfang an so machen sollen) Vielleicht möchten Sie den hochgeladenen Automator-Dienst aktualisieren. Auch wenn Sie den Leerraum und die Einrückung, die ich im Code habe, belassen würden, würde ich es begrüßen, da es meiner Meinung nach einfacher zu lesen und zu verstehen ist. Der Leerraum verlangsamt die Ausführung nicht.

Antworten (3)

Hier ist eine Möglichkeit, das erklärte Ziel mit einem Automator Service zu erreichen . Anstatt Scale Images zu verwenden, verwenden Sie Run Shell Script with settings, Shell: /bin/bash und Pass input: As arguments und fügen Sie den folgenden Code hinzu:

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"

Beachten Sie, dass die letzte Zeile im obigen Code weggelassen werden kann, wenn Sie Show Growl Notification verwenden , die ich nicht habe und warum ich einen Systemsound verwendet habe. Dies wurde unter OS X 10.8.5 durchgeführt und Sie müssen überprüfen, ob der Pfad zu den ausführbaren Dateien auf Ihrem System identisch ist, obwohl sie identisch sein sollten. Der Grund, warum ich den vollständig qualifizierten Pfadnamen jeder ausführbaren Datei verwende, ist, dass Automator einen Fehler ausgibt, wenn ich dies nicht tue. Sie können den FQP in einem Terminal abrufen which, indem Sie zB which sipsreturn verwenden /usr/bin/sips.

Beachten Sie, dass GetFileInfound SetFileein Teil von Xcode Tools sind und, falls noch nicht installiert, Sie installieren müssen, was durch Eingabe GetFileInfoeines Terminals und Befolgen der Eingabeaufforderungen ausgelöst werden kann.

Sie können die Manpages für jeden der verwendeten Befehle lesen, um durch das Verständnis dessen, was passiert, mehr zu erfahren.

Handbuchseiten für: GetFileInfo , sips und SetFile

Automator-Dienst

Ausgezeichnetes Drehbuch! Ich habe ein wenig mit Schlucken herumgespielt, aber ich habe die 50% nicht geschafft. Eine schöne Lösung. Wenn man es sieht, sieht es immer so einfach aus. Vielen Dank.
@ andere, die dieses coole Skript verwenden möchten, ohne es selbst von Grund auf neu zu erstellen, laden Sie die ZIP-Datei herunter und legen Sie sie im Ordner "Dienste" ab (normalerweise /Benutzer/Ihr_Benutzer/Bibliothek/Dienste/). Starten Sie es, indem Sie im Finder mit der rechten Maustaste auf ein Bild klicken und das Skript aus dem Untermenü „Dienste“ auswählen. Denken Sie daran, dass Sie, wie user343.. sagte, Xcode-Tools benötigen und möglicherweise die Pfade im Skript anpassen müssen.
@SeanJ, willst du damit sagen, dass du damit gespielt hast, sipsbevor du meine Antwort gesehen hast und es nicht zum Laufen bringen konntest? Ich frage, weil das geschriebene Skript sips1/2 Pixelbreite der Originaldatei hat, was $win meinen Tests immer funktioniert hat.

Das Dateisystem in Mac OS X behält 3 separate Zeitstempel für Dateien, wie folgt:

ctime- Änderungszeit (letzte Änderungszeit des Eigentümers der Datei, Berechtigungen

atime- Zugriffszeit (wann zuletzt auf die Datei oder den Inhalt zugegriffen wurde)

mtime- Änderungszeit (wann die eigentlichen Inhalte zuletzt geändert wurden)

Während diese während der verschiedenen Lebensphasen einer Datei durch normale Interaktion automatisch festgelegt werden, ist es wichtig zu verstehen, dass sie alle jederzeit auf jeden gewünschten (gültigen) Wert geändert werden können. Sie können die zuletzt geänderte Zeit mit einem einfachen Terminalbefehl auf ein früheres Datum überschreiben, wenn Sie dies wirklich müssen usw.:

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$ 

Alles, was Sie tun müssen, ist, die vorhandene Zeit, die Sie speichern möchten, abzulesen, Ihre Änderungen vorzunehmen und dann auf das Original zurückzusetzen. All dies kann in Automator durchgeführt werden.


Ich überlasse es Ihnen, damit zu spielen, das Folgende in Automator zu bekommen, da ich keine Zeit habe, aber hier ist ein schneller und schmutziger Weg (mit vielen Kommentaren und Überprüfungen, um sicherzustellen, dass Sie es verstehen, und es ist nicht nur eine Last von Terminal Befehle), um einen Zeitstempel zu lesen, ihn für später in einer Datei zu speichern und dann denselben Zeitstempel über die Befehlszeile erneut anzuwenden.

Sie sollten in der Lage sein, diese als kurze Skripte zu speichern, die so geändert wurden, dass sie den von Automator bereitgestellten Dateinamen akzeptieren) und diese Skripte dann als einzelne Automator-Aktionen aufrufen können


Das Schwierige ist, die gesamte Datumszeichenfolge auf einmal zu erfassen, da Sie die Formatänderungen sehen können und Sie die Zeit verlieren, um das Jahr für alte Dateien anzuzeigen (und da wir gerade in 2016 gerollt sind, fast alle Ihre Dateien zeigt einfach 2015 anstelle des Zeitstempels an, wenn Sie 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

...Sie können also andere Befehle verwenden, wie getfileinfozum Beispiel:

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

Also, ohne weiteres Umschweife, hier ist ein schrecklicher Hack, den jemand verbessern kann:

Schritt 1 , lesen Sie den Zeitstempel und speichern Sie ihn in einer Variablen und auch in einer Datei, damit wir ihn später abrufen können

Richten Sie die Datei ein und geben Sie ihr eine ältere geänderte Zeit, als wäre es eine alte Datei, und listen Sie die geänderte Zeit auf, um Folgendes zu beweisen:

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

Jetzt lesen wir den Zeitstempel und übergeben ihn durch einen Befehl, der awkein paar Mal aufgerufen wird, um das Leerzeichen im Zeitstempel zu entfernen und ihn durch einen Doppelpunkt zu ersetzen. Dann verwenden wir /und :als Trennzeichen und geben das Datum in dem Format aus, das für die erforderlich ist touch-Befehl später ( das ist ein bisschen unangenehm, aber im Wesentlichen verwendet der erste Durchgang ohne ein bereitgestelltes Trennzeichen standardmäßig ein Leerzeichen, das ich durch einen Doppelpunkt ersetze, damit der nächste Durchgang, der speziell abgrenzt, richtig funktioniert - ich konnte es nicht :bekommen einen Platz zu nutzen und : und /in einem Durchgang... - aber Lesbarkeit war wichtiger als Effizienz ) . Wiederholen Sie die Variable, um zu beweisen, dass Sie sie korrekt erstellt haben, und speichern Sie sie dann in einer Datei, damit Sie sie später haben. Lesen Sie die Datei, um sie zu beweisen:

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

Schritt 2 Nehmen Sie nun Änderungen an der Datei vor

Hier hänge ich nur etwas Text an, aber Ihr Automator würde hier seine Sachen machen und dann die geänderten geänderten Zeiten drucken, um zu beweisen, dass es geändert wurde:

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

Schritt 3 Setzen Sie den alten Zeitstempel zurück

Setzen Sie nun den geänderten Zeitstempel zurück, indem Sie die Touch-Datei verwenden, wie oben in dieser Antwort gezeigt, aber automatisieren Sie das Bit, in dem wir das Datum einfügen, um den Inhalt der Datei einzuschließen, von der wir jetzt wissen, dass sie den benötigten Zeitstempel im richtigen Format enthält:

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

Einige weitere Überprüfungen, um zu beweisen, dass der ursprüngliche Zeitstempel vorhanden ist:

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
Hi Stuffe, danke für die ausführliche Erklärung. Ich bin immer noch ein unerfahrener Benutzer von Terminal, aber ich habe es mit Ihrer exemplarischen Vorgehensweise geschafft. Für das regelmäßige Verkleinern von Fotos werde ich mich für Automator entscheiden, da sich der Zeitunterschied mit Bash summiert.

Dies ist möglich, ohne Xcode herunterladen zu müssen

Mit dem sipsBefehl in der Aktion „ Run Shell Script “ ersetzen Sie die Aktion „ Images skalieren “.

Das Skript verwendet den statBefehl, um die Erstellungs- und Änderungsdaten der Datei abzurufen, und den touchBefehl, um die Daten der Datei zu ändern.

Das Bash-Skript:

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

Sie können die Qualität (die Zahl after -s formatOptions) von 0-100 ändern , der Standardwert ist 80 .

100 = beste Qualität und größere Datei, 0 = schlechte Qualität und kleinere Datei.

Schöne Antwort, obwohl es wie geschrieben fehlschlägt syntax error near unexpected token ('und tDates =($(stat -f "%SB %Sm" -t "%Y%m%d%H%M.%S" "$f"))'Sie daher das Leerzeichen in entfernen müssen tDates =. Außerdem müssen Sie Xcode nicht herunterladen. Xcode und Xcode Tools sind zwei verschiedene Dinge und ziemlich unterschiedlich in der Größe. Xcode ist größer als 4 GB und Xcode Tools kleiner als 200 MB. Es ist jedoch schön, auch eine native Lösung zu haben.