Mit der Option -printf
lassen sich die Ergebnisse des Kommandozeilen-Tools find in einem gewünschten Format ausgeben. Mit dem Format %T@
kann man sich beispielsweise das letzte Änderungsdatum von Dateien im Unix-Timestamp-Format anzeigen lassen, hier nach einer Sortierung von der zuletzt geänderten Datei in einem Verzeichnis:
$ find . -printf '%T@\n' | sort -r | head -n 1
1562145949.4856600690
Allerdings enthält der Timestamp nicht nur die ganzzahlige Anzahl an Sekunden seit dem 01.01.1970, sondern auch einen Bruchteil. Möchte man das Ergebnis weiterverarbeiten oder vergleichen, kann man den Bruchteil in der Bash „wegschnipseln“:
#!/bin/bash
timestamp=$(find . -printf '%T@\n' | sort -r | head -n 1)
echo "${timestamp%.*}"
# Ergebnis: 1562145949
Nun bin ich vor kurzem über die Möglichkeit gestolpert, dass unter bestimmten Umständen bereits mit find ein Unix-Timestamp ohne Bruchteil ausgegeben werden kann. In der Manpage von find wird dieser zwar nicht unter den möglichen Formaten aufgelistet, allerdings findet sich dort im Abschnitt zu -printf
der Hinweis, dass der Modifier nach %T bzw. %A als Anweisung an die C-Funktion strftime verwendet wird:
%Ak File’s last access time in the format specified by k, which is either `@‘ or a directive for the C `strftime‘ function. The possible values for k are listed below; some of them might not be available on all systems, due to differences in `strftime‘ between systems.
In der Manpage von strftime auf meinem Linux ist nun auch das Format %s für einen Unix-Timestamp ohne Bruchteil aufgeführt:
%s The number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). (TZ) (Calculated from mktime(tm).)
Und tatsächlich lässt sich auf meinem Linux für die Option -printf
auch das Format %Ts
verwenden:
$ find . -printf '%Ts\n' | sort -r | head -n 1
1562145949