OSSP CVS Repository

ossp - ossp-pkg/shtool/sh.mdate
Not logged in
[Honeypot]  [Browse]  [Directory]  [Home]  [Login
[Reports]  [Search]  [Ticket]  [Timeline
  [Raw

ossp-pkg/shtool/sh.mdate
##
##  mdate -- Pretty-print modification time of a file or dir
##  Copyright (c) 1995-1997 Free Software Foundation, Inc.
##  Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
##
##  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
        shtool_exit 1
        ;;
esac
if [ ! -r "$fod" ]; then
    echo "$msgprefix:Error: file or directory not found: $fod" 1>&2
    shtool_exit 1
fi

#   GNU ls changes its time format in response to the TIME_STYLE
#   variable. Since we cannot assume "unset" works, revert this
#   variable to its documented default.
if [ ".$TIME_STYLE" != . ]; then
    TIME_STYLE=posix-long-iso
    export TIME_STYLE
fi

#   get the extended ls output of the file or directory.
if /bin/ls -L /dev/null >/dev/null 2>&1; then
    set - x`/bin/ls -L -l -d $fod`
else
    set - x`/bin/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"

shtool_exit 0

##
##  manual page
##

=pod

=head1 NAME

B<shtool mdate> - B<GNU shtool> pretty-print last modification time

=head1 SYNOPSIS

B<shtool mdate>
[B<-n>|B<--newline>]
[B<-z>|B<--zero>]
[B<-s>|B<--shorten>]
[B<-d>|B<--digits>]
[B<-f>|B<--field-sep> I<str>]
[B<-o>|B<--order> I<spec>]
I<path>

=head1 DESCRIPTION

This command pretty-prints the last modification time of a given file or
directory I<path>, while still allowing one to specify the format of the
date to display.

=head1 OPTIONS

The following command line options are available.

=over 4

=item B<-n>, B<--newline>

By default, output is written to F<stdout> followed by a "newline"
(ASCII character 0x0a). If option B<-n> is used, this newline character
is omitted.

=item B<-z>, B<--zero>

Pads numeric day and numeric month with a leading zero. Default is to
have variable width.

=item B<-s>, B<--shorten>

Shortens the name of the month to a english three character
abbreviation. Default is full english name. This option is silently
ignored when combined with B<-d>.

=item B<-d>, B<--digits>

Use digits for month. Default is to use a english name.

=item B<-f>, B<--field-sep> I<str>

Field separator string between the day month year tripple. Default is a
single space character.

=item B<-o>, B<--order> I<spec>

Specifies order of the day month year elements within the tripple. Each
element represented as a single character out of ``C<d>'', ``C<m>'' and
``C<y>''. The default for I<spec> is ``C<dmy>''.

=head1 EXAMPLE

 #   shell script
 shtool mdate -n /
 shtool mdate -f '/' -z -d -o ymd foo.txt
 shtool mdate -f '-' -s foo.txt

=head1 HISTORY

The B<GNU shtool> B<mdate> command was originally written by
Ulrich Drepper in 1995 and revised by Ralf S. Engelschall
E<lt>rse@engelschall.comE<gt> in 1998 for inclusion into B<GNU shtool>.

=head1 SEE ALSO

shtool(1), date(1), ls(1).

=cut


CVSTrac 2.0.1