Why you shouldn't use ls
:
Parsing ls
is a bad idea. Not only is the behaviour of certain characters in filenames undefined and platform dependant, for your purposes, it'll mess with dates when they're six months in the past. In short, yes, it'll probably work for you in your limited testing. It will not be platform-independent (so no portability) and the behaviour of your parsing is not guaranteed given the range of 'legal' filenames on various systems. (Ext4, for example, allows spaces and newlines in filenames).
Having said all that, personally, I'd use ls
because it's fast and easy ;)
Edit
As pointed out by Hugo in the comments, the OP doesn't want to use stat
. In addition, I should point out that the below section is BSD-stat specific (the %Sm
flag doesn't work when I test on Ubuntu; Linux has a stat
command, if you're interested in it read the man page).
So, a non-stat
solution: use date
date
, at least on Linux, has a flag: -r
, which according to the man page:
display the last modification time of FILE
So, the scripted solution would be similar to this:
date -r ${MY_FILE_VARIABLE}
which would return you something similar to this:
zsh% date -r MyFile.foo
Thu Feb 23 07:41:27 CST 2012
To address the OP's comment:
If possible with a configurable date format
date
has a rather extensive set of time-format variables; read the man page for more information.
I'm not 100% sure how portable date
is across all 'UNIX-like systems'. For BSD-based (such as OS X), this will not work; the -r
flag for the BSD-date does something completely different. The question doesn't' specify exactly how portable a solution is required to be. For a BSD-based solution, see the below section ;)
A better solution, BSD systems (tested on OS X, using BSD-stat; GNU stat is slightly different but could be made to work in the same way).
Use stat
. You can format the output of stat
with the -f
flag, and you can select to display only the file modification data (which, for this question, is nice).
For example, stat -f "%m%t%Sm %N" ./*
:
1340738054 Jun 26 21:14:14 2012 ./build
1340738921 Jun 26 21:28:41 2012 ./build.xml
1340738140 Jun 26 21:15:40 2012 ./lib
1340657124 Jun 25 22:45:24 2012 ./tests
Where the first bit is the UNIX epoch time, the date is the file modification time, and the rest is the filename.
Breakdown of the example command
stat -f "%m%t%Sm %N" ./*
stat -f
: call stat
, and specify the format (-f
).
%m
: The UNIX epoch time.
%t
: A tab seperator in the output.
%Sm
: S
says to display the output as a string
, m
says to use the file modification data.
%N
: Display the name of the file in question.
A command in your script along the lines of the following:
stat -f "%Sm" ${FILE_VARIABLE}
will give you output such as:
Jun 26 21:28:41 2012
Read the man page for stat
for further information; timestamp formatting is done by strftime
.
stat
? – Magnoliadate
doesn't support the-r
flag), could you provide more specific platform information - you've tagged withLinux
andUnix
;stat
anddate
are both (as far as I know) pretty widespread on the various Linux distributions I've come across. – Scum