If I last modified a file 5 minutes ago, is it possible to make ls-l
output something like "5 mins" instead of the actual date/time?
If I last modified a file 5 minutes ago, is it possible to make ls-l
output something like "5 mins" instead of the actual date/time?
Answering my own question here because this is what I actually ended up doing.
I could not get any satisfactory results using anything that parsed the output of ls -l
into a word stream (bash
, awk
, column
etc) because a) filenames with spaces in messed up, and b) ls -l
's aligned columns messed up (for example, right-aligned filesizes). ls -l | column -t
shows both problems at once.
I will get shot down for the inefficiency in this, but this is my eventual script that uses sed
to replace parts of the output of ls -l
maintaining column width:
day0=`date +"%b %_d"`
day1=`date --date "1 day ago" +"%b %_d"`
day2=`date --date "2 days ago" +"%b %_d"`
day3=`date --date "3 days ago" +"%b %_d"`
day4=`date --date "4 days ago" +"%b %_d"`
day5=`date --date "5 days ago" +"%b %_d"`
day6=`date --date "6 days ago" +"%b %_d"`
min0=`date +"%H:%M"`
min1=`date --date "1 minute ago" +"%H:%M"`
min2=`date --date "2 minutes ago" +"%H:%M"`
min3=`date --date "3 minutes ago" +"%H:%M"`
min4=`date --date "4 minutes ago" +"%H:%M"`
min5=`date --date "5 minutes ago" +"%H:%M"`
min6=`date --date "6 minutes ago" +"%H:%M"`
min7=`date --date "7 minutes ago" +"%H:%M"`
min8=`date --date "8 minutes ago" +"%H:%M"`
min9=`date --date "9 minutes ago" +"%H:%M"`
ls -lh --color=force --quoting-style=shell-escape "$@"|sed "
/$day6 (.[0-9]:[0-9][0-9])/ s/$day6/6 days/; t
/$day5 (.[0-9]:[0-9][0-9])/ s/$day5/5 days/; t
/$day4 (.[0-9]:[0-9][0-9])/ s/$day4/4 days/; t
/$day3 (.[0-9]:[0-9][0-9])/ s/$day3/3 days/; t
/$day2 (.[0-9]:[0-9][0-9])/ s/$day2/2 days/; t
/$day1 (.[0-9]:[0-9][0-9])/ s/$day1/yesday/; t
/$day0 (.[0-9]:[0-9][0-9])/ s/$day0/ today/; T
s/$min0/ now/; t
s/$min1/1 min/; t
s/$min2/2 min/; t
s/$min3/3 min/; t
s/$min4/4 min/; t
s/$min5/5 min/; t
s/$min6/6 min/; t
s/$min7/7 min/; t
s/$min8/8 min/; t
s/$min9/9 min/; t
"
Sample output of /var/log/syslog*
:
-rw-r----- 1 syslog adm 9240 today now /var/log/syslog
-rw-r----- 1 syslog adm 1279965 today 8 min /var/log/syslog.1
-rw-r----- 1 syslog adm 51750 2 days 14:12 /var/log/syslog.2.gz
-rw-r----- 1 syslog adm 14768 3 days 10:59 /var/log/syslog.3.gz
-rw-r----- 1 syslog adm 7767 4 days 10:04 /var/log/syslog.4.gz
-rw-r----- 1 syslog adm 119295 5 days 09:49 /var/log/syslog.5.gz
-rw-r----- 1 syslog adm 33450 6 days 13:06 /var/log/syslog.6.gz
-rw-r----- 1 syslog adm 21372 Jan 25 11:12 /var/log/syslog.7.gz
(not sure why log appears here in red; it doesn't on my terminal.)
This is only used from the command line so all those date
commands don't matter, in fact I don't notice any delay at all.
Update:
time
output for `ls -l /var/log/syslog*':
real 0m0.002s
user 0m0.002s
sys 0m0.000s
time
output for for my new script:
real 0m0.019s
user 0m0.018s
sys 0m0.003s