Wednesday, May 1, 2024
0
rated 0 times [  0] [ 0]  / answers: 1 / hits: 1106  / 3 Years ago, sat, september 4, 2021, 6:50:32

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?


More From » command-line

 Answers
0

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

[#2055] Monday, September 6, 2021, 3 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
allally

Total Points: 487
Total Questions: 106
Total Answers: 110

Location: Laos
Member since Sun, Jul 3, 2022
2 Years ago
allally questions
;