Exact timestamp for sorting and renaming files according to
creation order
Polytropon
freebsd at edvax.de
Wed Jan 4 14:29:52 UTC 2012
On Wed, 04 Jan 2012 15:01:32 +0100, Julian H. Stacey wrote:
> Hi,
> Devin Teske wrote:
> > > -----Original Message-----
> > > From: owner-freebsd-questions at freebsd.org [mailto:owner-freebsd-
> > > questions at freebsd.org] On Behalf Of Polytropon
> > > Sent: Tuesday, January 03, 2012 1:00 PM
> > > To: Dan Nelson
> > > Cc: FreeBSD Questions
> > > Subject: Re: Exact timestamp for sorting and renaming files according to
> > creation
> > > order
> > >
> > > On Tue, 3 Jan 2012 14:49:02 -0600, Dan Nelson wrote:
> > > > If you ask for the date to be printed in "float" (F) format, it gives
> > > > more precision. The default is unsigned int (U) format.
> > > >
> > > > % stat -f "%N %FB" /COPYRIGHT
> > > > /COPYRIGHT 1306190895.046721049
> > >
> > > Strangely, I only get a 000000000 "suffix" for any time stamp, no matter if I
> > create
> > > the file or apply the command as shown above to an existing file:
> > >
> > > % stat -f "%N %FB" /COPYRIGHT
> > > /COPYRIGHT 1313951230.000000000
> > >
> > > Am I missing some file system feature?
> > >
> > > Otherwise, this _exactly_ looks like what I'm searching for. It doesn't need
> > to be
> > > a "human-readable" date representation.
> > >
> > > by the way, I'm running FreeBSD 8.2-STABLE/x86 of late August 2011 here, file
> > > system used is UFS2.
> >
> > On ZFS, all is well...
> >
> > % df -hT /raid1/jails/package8-1/COPYRIGHT
> > Filesystem Type Size Used Avail Capacity Mounted on
> > raid1/jails/package8-1 zfs 835G 672M 835G 0%
> > /raid1/jails/package8-1
> >
> > % stat -f "%N %FB" /raid1/jails/package8-1/COPYRIGHT
> > /raid1/jails/package8-1/COPYRIGHT 1324356049.328275367
> >
> > But alas, on UFS2:
> >
> > % df -hT /COPYRIGHT
> > Filesystem Type Size Used Avail Capacity Mounted on
> > /dev/mfid0s1a ufs 989M 64M 846M 7% /
> >
> > % stat -f "%N %FB" /COPYRIGHT
> > /COPYRIGHT 1279505857.000000000
The idea of changing the sysctl vfs.timestamp_precision
to the value 3 worked on UFS for me. But it doesn't seem
to be the default.
Another problem might be when dealing with files that are
stored on a filesystem type different from UFS...
> I was wondering how df (& stat) could show more than seconds
> (Remembering back to 1990 & my
> http://berklix.com/~jhs/src/bsd/jhs/bin/public/statv/
> when Unix used unsigned long seconds since 1 jan 1970
> ( & MSDOS was seconds divided by 2 since 1 jan 1980 )
> )
> FreeBSD 8.2-RELEASE /usr/src/usr.bin/stat/stat.c
> line 320 etc still uses the normal fstat stat lstat.
> But man 2 stat has extended :
> #ifndef _POSIX_SOURCE
> #define st_atime st_atimespec.tv_sec
> #define st_mtime st_mtimespec.tv_sec
> #define st_ctime st_ctimespec.tv_sec
> #endif
The st_birthtime field would be the required one for
sorting here (and defaults, per definition, to seconds).
The "man 1 stat" mentions that stat uses the stat and
lstat system system calls, so this would be the value
that will be retrieved of no "finer time" can be
accessed (which would mean zeros here).
> cd /usr/include/sys ; vi -c/tv_sec /types.h stat.h
> #if __BSD_VISIBLE
> #define st_atime st_atimespec.tv_sec
> struct timespec
> #include <sys/time.h>
> time.h: #include <sys/timespec.h>
> timespec.h:
> struct timespec {time_t tv_sec;/* seconds */ long tv_nsec;/* nanoseconds */};
>
> I guess extended timespec may get compiled in to VFS but not UFS,
> but no time to look further, Good luck Polytropn.
At least that's a starting point. I see that changing
the sysctl mentioned above seems to be sufficient for
the current purpose. However, I'd like to see the system
defaulting (!) to a resolution better than seconds, as
this is definitely possible.
> PS Here with UFS (per Dan's tip, thanks) I see:
> sysctl vfs.timestamp_precision=2 ; stat -f "%N %FB" /etc/motd
> /etc/motd 1306839862.000000000
That's understandable, as the "finer time" will
be generated only upon file _creation_; for files
that are already present, 000000000 is the typical
result.
# sysctl vfs.timestamp_precision=3
vfs.timestamp_precision: 0 -> 3
And then:
% touch hickup.txt
% stat -f "%N %FB" hickup.txt
hickup.txt 1325686735.035925369
In comparison:
% stat -f "%N %FB" /etc/motd
/etc/motd 1309547364.000000000
which has been created prior to changing the
vfs.timestamp_precision sysctl.
--
Polytropon
Magdeburg, Germany
Happy FreeBSD user since 4.0
Andra moi ennepe, Mousa, ...
More information about the freebsd-questions
mailing list