Wenn ich mich richtig erinnere, der bestimmende Faktor von ls -l
zur Ausgabe ein date/time
oder Ausgang ein date/year
ist, ob das mtime
Jahr zurück von stat
entspricht der aktuellen Jahre. Wenn die Datei mtime
Jahr dem current
Jahr entspricht, dann wird date/time
Information zur Verfügung gestellt, wenn das mtime
Jahr nicht das gegenwärtige Jahr ist, dann date/year
Information wird zur Verfügung gestellt.
Um den Vergleich durchzuführen, müssen Sie struct tm
für die Datei mtime
und now
ausfüllen.Das folgende Beispiel verwendet localtime_r
, um jedes struct tm
zu füllen, macht den Vergleich und gibt dann die Dateidetails entsprechend aus.
(Der Code liest/vergleicht mtimes
s und gibt das Zeitformat für alle als Argumente bereitgestellten Dateinamen aus. (Eine Platzhalterzeichenfolge wird verwendet, um grundlegende Formatierungen für Dateiberechtigungen, Anzahl, Benutzer, Gruppe, Größe usw. bereitzustellen).)
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#define MAXC 64
void dump_tm (struct tm *t);
int main(int argc, char **argv)
{
int i = 0;
char time_str[MAXC] = "";
time_t now = time (NULL);
struct stat sb;
struct tm tmfile, tmnow;
if (argc < 2) { /* validate sufficient arguments provided */
fprintf (stderr, "error: insufficient input, usage: %s <pathname>\n",
argv[0]);
return 1;
}
for (i = 1; i < argc; i++) { /* for each file given as arg */
if (stat(argv[i], &sb) == -1) { /* validate stat of file */
perror("stat");
return 1;
}
localtime_r (&sb.st_mtime, &tmfile); /* get struct tm for file */
localtime_r (&now, &tmnow); /* and now */
if (tmfile.tm_year == tmnow.tm_year) { /* compare year values */
strftime (time_str, sizeof (time_str), "%b %e %H:%M",
&tmfile); /* if year is current output date/time */
printf ("permission 1 user group 12345 %s %s\n",
time_str, argv[i]);
}
else { /* if year is not current, output time/year */
strftime (time_str, sizeof (time_str), "%b %e %Y",
&tmfile);
printf ("permission 1 user group 12345 %s %s\n",
time_str, argv[i]);
}
}
return 0;
}
Beispiel ls -l
Ausgabe
$ ls -l tmp.c ls_time_date_fmt.c
-rw-r--r-- 1 david david 1312 Apr 6 03:15 ls_time_date_fmt.c
-rw-r--r-- 1 david david 2615 May 23 2014 tmp.c
Programm Use/Output
$ ./bin/ls_time_date_fmt ls_time_date_fmt.c tmp.c
permission 1 user group 12345 Apr 6 03:15 ls_time_date_fmt.c
permission 1 user group 12345 May 23 2014 tmp.c
Lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.
Werfen Sie einen Blick auf [strftime] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html). Sie können auch 'difftime' verwenden, um herauszufinden, wie alt die Datei ist. – rici