File: sh.mdate

package info (click to toggle)
shtool 1.6.0-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 400 kB
  • ctags: 5
  • sloc: perl: 379; makefile: 156; sh: 52
file content (152 lines) | stat: -rw-r--r-- 4,548 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
##
##  mdate -- Pretty-print modification time of a file or dir
##  Copyright (c) 1995-1997 Free Software Foundation, Inc.
##  Originally idea and basis code by Ulrich Drepper
##  Enhanced by Ralf S. Engelschall for shtool
##
##  This file is part of shtool and free software; you can redistribute
##  it and/or modify it under the terms of the GNU General Public
##  License as published by the Free Software Foundation; either version
##  2 of the License, or (at your option) any later version.
##
##  This file is distributed in the hope that it will be useful,
##  but WITHOUT ANY WARRANTY; without even the implied warranty of
##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
##  General Public License for more details.
##
##  You should have received a copy of the GNU General Public License
##  along with this program; if not, write to the Free Software
##  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
##  USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
##

str_tool="mdate"
str_usage="[-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits] [-f|--field-sep <str>] [-o|--order <spec>] <path>"
arg_spec="1="
opt_spec="n.z.s.d.f:o:"
opt_alias="n:newline,z:zero,s:shorten,d:digits,f:field-sep,o:order"
opt_n=no
opt_z=no
opt_s=no
opt_d=no
opt_f=" "
opt_o="dmy"

. ./sh.common

fod="$1"
case "$opt_o" in
    [dmy][dmy][dmy] )
        ;;
    * ) echo "$msgprefix:Error: invalid argument to option \`-o': $opt_o" 1>&2
        exit 1
        ;;
esac
if [ ! -r "$fod" ]; then
    echo "$msgprefix:Error: file or directory not found: $fod" 1>&2
    exit 1
fi

#   prevent "date" giving response in another language
LANG=C;    export LANG
LC_ALL=C;  export LC_ALL
LC_TIME=C; export LC_TIME

#   get the extended ls output of the file or directory.
if ls -L /dev/null >/dev/null 2>&1; then
    set - x`ls -L -l -d $fod`
else
    set - x`ls -l -d $fod`
fi

#   The month is at least the fourth argument
#   (3 shifts here, the next inside the loop).
shift; shift; shift

#   Find the month. Next argument is day, followed by the year or time.
month=""
while [ ".$month" = . ]; do
    shift
    case $1 in
        Jan) month=January;   nummonth=1  ;;
        Feb) month=February;  nummonth=2  ;;
        Mar) month=March;     nummonth=3  ;;
        Apr) month=April;     nummonth=4  ;;
        May) month=May;       nummonth=5  ;;
        Jun) month=June;      nummonth=6  ;;
        Jul) month=July;      nummonth=7  ;;
        Aug) month=August;    nummonth=8  ;;
        Sep) month=September; nummonth=9  ;;
        Oct) month=October;   nummonth=10 ;;
        Nov) month=November;  nummonth=11 ;;
        Dec) month=December;  nummonth=12 ;;
    esac
done
day="$2"
year="$3"

#   We finally have to deal with the problem that the "ls" output
#   gives either the time of the day or the year.
case $year in
    *:*)
        this_year=`date '+%Y' 2>/dev/null`
        if [ ".$this_year" = . ]; then
            this_year=`date '+%y'`
            case $this_year in
                [5-9][0-9]) this_year="19$this_year" ;;
                [0-4][0-9]) this_year="20$this_year" ;;
            esac
        fi
        #   for the following months of the last year the time notation
        #   is usually also used for files modified in the last year.
        this_month=`date '+%m'`
        if (expr $nummonth \> $this_month) >/dev/null; then
            this_year=`expr $this_year - 1`
        fi
        year="$this_year"
        ;;
esac

#   Optionally fill day and month with leeding zeros
if [ ".$opt_z" = .yes ]; then
    case $day in
        [0-9][0-9] ) ;;
             [0-9] ) day="0$day" ;;
    esac
    case $nummonth in
        [0-9][0-9] ) ;;
             [0-9] ) nummonth="0$nummonth" ;;
    esac
fi

#   Optionally use digits for month
if [ ".$opt_d" = .yes ]; then
    month="$nummonth"
fi

#   Optionally shorten the month name to three characters
if [ ".$opt_s" = .yes ]; then
    month=`echo $month | cut -c1-3`
fi

#   Output the resulting date string
echo dummy | awk '{
    for (i = 0; i < 3; i++) {
        now = substr(order, 1, 1);
        order = substr(order, 2);
        if (now == "d")
            out = day;
        else if (now == "m")
            out = month;
        else if (now == "y")
            out = year;
        if (i < 2)
            printf("%s%s", out, field);
        else
            printf("%s", out);
    }
    if (newline != "yes")
        printf("\n");
}' "day=$day" "month=$month" "year=$year" \
   "field=$opt_f" "order=$opt_o" "newline=$opt_n"