On Thu, 10 Jan 2008, Florin Iucha wrote:

> We can switch the arguments around and use a less likely separator 
> (warning, untested):
>
> find /some/dir -type f -printf "%T@^%h/%f\n" | awk -F^ '{ if ($1 > the_max) { the_max = $1; file_name = $2; } }
> END { print file_name }'

That will fail only if the newest file has a caret (^) in the filename, 
but you can deal with that by printing the full line and using "cut" to 
parse it:

find /some/dir -type f -printf "%T@^%h/%f\n" | awk -F^ '{ if ($1 > the_max) { the_max = $1; file_name = $0; } }
END { print file_name }' | cut -d^ -f 2-

That seems to work.  It gives the filename as output instead of the date.

This makes me want to write a little script for finding the newest file 
with "some/dir" given as input on the command line.  I do need this kind 
of thing sometimes.  I think I would do it by having a fast and slow form 
where the fast version used awk and only printed the newest file, but the 
slow version used sort and printed the n newest files along with the 
number of days, minutes and seconds since they were modified.

When I'm doing this in a single directory, I just do this:

ls -lAFtc | head -n

where the "n" is replaced by the number of newest files I want to see. 
The "t" argument to ls forces it to sort by date and the "c" argument 
makes it use the real modification time instead of the date stamp (which 
can be changed by "touch").  If someone breaks into your machine and 
modifies files they'll often change date stamps to make it seem like the 
files were not modified recently, so "ls -lc" will reveal this.

Mike