59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
set -e
 | 
						|
(( $# > 0 )) || exit
 | 
						|
 | 
						|
# Displays the time since $1 in a human readable format (e.g. 4h 25m 55s). If given a
 | 
						|
# file, the modified time is used. If $1 == "--", then this script acts as a converter,
 | 
						|
# converting $2 into human a readable format, e.g. since -- 72 #=> 1m 12s
 | 
						|
 | 
						|
# TODO: A help fallback
 | 
						|
# TODO: Options parsing
 | 
						|
 | 
						|
# `date` on OSX does not have the --date parameter
 | 
						|
date=date
 | 
						|
if [[ $OSTYPE == darwin* ]]; then
 | 
						|
    date=gdate
 | 
						|
elif ! command -v $date >/dev/null; then
 | 
						|
    echo "Unsupported system"
 | 
						|
    exit 1
 | 
						|
fi
 | 
						|
 | 
						|
# If given a file, give time since last modification
 | 
						|
(( $# == 1 )) && [[ -f $@ ]] && arg=reference || arg=date
 | 
						|
 | 
						|
args="$*"
 | 
						|
if [[ $1 == -- ]]; then
 | 
						|
    t="$2"
 | 
						|
else
 | 
						|
    now=$(${date} +%s)
 | 
						|
    then=$(${date} --$arg="$*" +%s)
 | 
						|
 | 
						|
    # Show full target date
 | 
						|
    echo $(${date} --date="@$then")
 | 
						|
 | 
						|
    t=$(( $now - $then ))
 | 
						|
fi
 | 
						|
 | 
						|
# Bash doesn't support floating point arithmetic like zsh does, therefore:
 | 
						|
bc <<EOF
 | 
						|
    define abs(i) {
 | 
						|
        if (i < 0) return (-i)
 | 
						|
        return (i)
 | 
						|
    }
 | 
						|
 | 
						|
    t = abs($t)
 | 
						|
 | 
						|
    weeks = t / 60 / 60 / 24 / 7
 | 
						|
    days = t / 60 / 60 / 24 % 7
 | 
						|
    hours = t / 60 / 60 % 24
 | 
						|
    minutes = t / 60 % 60
 | 
						|
    seconds = t % 60
 | 
						|
 | 
						|
    if (weeks > 0) print weeks, "w "
 | 
						|
    if (days > 0) print days, "d "
 | 
						|
    if (hours > 0) print hours, "h "
 | 
						|
    if (minutes > 0) print minutes, "m "
 | 
						|
    print seconds, "s"
 | 
						|
EOF
 | 
						|
 |