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?
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 sips
return verwenden /usr/bin/sips
.
Beachten Sie, dass GetFileInfo
und SetFile
ein Teil von Xcode Tools sind und, falls noch nicht installiert, Sie installieren müssen, was durch Eingabe GetFileInfo
eines 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
sips
bevor du meine Antwort gesehen hast und es nicht zum Laufen bringen konntest? Ich frage, weil das geschriebene Skript sips
1/2 Pixelbreite der Originaldatei hat, was $w
in 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 getfileinfo
zum 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 awk
ein 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
Dies ist möglich, ohne Xcode herunterladen zu müssen
Mit dem sips
Befehl in der Aktion „ Run Shell Script “ ersetzen Sie die Aktion „ Images skalieren “.
Das Skript verwendet den stat
Befehl, um die Erstellungs- und Änderungsdaten der Datei abzurufen, und den touch
Befehl, 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.
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.
Benutzer3439894
Milliways
jpeg
in das Datumsfeld zu kopieren.bash
Ich habe auch ein Automator-Skript, um dies zu tun, das aus dem einfachen Skript bestehtjhead -ft "$*"
. Wenn Sie diese Suche nachjhead
.SeanJ
Benutzer3439894
-m
@SeanJ, ich habe den Code bearbeitet, um SetFile-Befehle zu kombinieren, um ihn nur einmal mit den Flags und-d
gleichzeitig 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.