Wie kann ein Startskript eine Datei mit Zeitstempel erstellen?

375
philosopher

Ich versuche, ein einfaches launchd-Skript auszuführen, das eine Datei von einem Verzeichnis in ein anderes kopiert, wenn sich die Datei ändert. Ich möchte sie jedoch mit einem eindeutigen Zeitstempel einfügen, damit ich die Dateien versionieren kann. Mein Startskript sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>change.file.copy</string> <key>ProgramArguments</key> <array> <string>cp</string> <string>/path/to/folder/sample_file.txt</string> <string>/path/to/another_folder/$(gdate +%Y%m%d_%T.%N)_sample_file.txt</string> </array> <key>WatchPaths</key> <array> <string>/path/to/folder/sample_file.txt</string> </array> </dict> </plist> 

Der Befehl funktioniert einwandfrei, wenn ich ihn durch das Terminal starte, dh wenn ich:

cp /path/to/folder/sample_file.txt /path/to/another_folder/$(gdate +%Y%m%d_%T.%N)_sample_file.txt 

Wenn jedoch das Ereignis ausgelöst wird, wird stattdessen eine Datei mit der Zeichenfolge (gdate +% Y% m% d_% T.% N) anstelle des tatsächlichen Datums erstellt, dh der Datumsoperator wird nicht aufgelöst, wenn er durch launchd ausgeführt wird.

Ich konnte immer eine ausführbare Datei erstellen und diese durch launchd laufen lassen, aber ich wunderte mich, warum das Obige nicht richtig funktioniert.

Danke für die Hilfe!

1

1 Antwort auf die Frage

1
philosopher

Hier ist die Lösung. Suchen mit den richtigen Keywords bei Google ist alles.

<key>ProgramArguments</key> <array> <string>bash</string> <string>-c</string> <string>cp /path/to/folder/sample.txt /path_to_another_folder/$(/usr/local/bin/gdate +%Y%m%d_%T.%N)_sample.txt</string> </array>