goelweb.com --> Software --> Unix utilities --> Determine modification time of file in YYYYMMDD format
GNU/Linux command ls does not provide the year a file was last modified. Writing a C program to determine that information seemed like an overkill. After much searching online, I came up with the following:
$ perl -e '( $mday, $mon, $year ) = ( localtime( ( stat "filename" )[ 9 ] ) )[ 3, 4, 5 ]; printf "%d%02d%02d\n", $year + 1900, $mon + 1, $mday'
By studying this example and using the notes below, you can get file properties in a myriad of formats.
Returns a 13-element list giving the status info for a file, either the file opened via FILEHANDLE, or named by EXPR. If EXPR is omitted, it stats $_ . Returns a null list if the stat fails. Typically used as follows:
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= stat($filename);
Not all fields are supported on all filesystem types. Here are the meanings of the fields:
0 dev device number of filesystem 1 ino inode number 2 mode file mode (type and permissions) 3 nlink number of (hard) links to the file 4 uid numeric user ID of file's owner 5 gid numeric group ID of file's owner 6 rdev the device identifier (special files only) 7 size total size of file, in bytes 8 atime last access time in seconds since the epoch 9 mtime last modify time in seconds since the epoch 10 ctime inode change time in seconds since the epoch (*) 11 blksize preferred block size for file system I/O 12 blocks actual number of blocks allocated
(The epoch was at 00:00 January 1, 1970 GMT.)
(*) Not all fields are supported on all filesystem types.
Converts a time as returned by the time function to a 9-element list with the time analyzed for the local time zone. Typically used as follows:
# 0 1 2 3 4 5 6 7 8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
All list elements are numeric, and come straight out of the C `struct tm'. $sec , $min , and $hour are the seconds, minutes, and hours of the specified time.
$mday is the day of the month, and $mon is the month itself, in the range 0..11 with 0 indicating January and 11 indicating December. This makes it easy to get a month name from a list:
my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
print "$abbr[$mon] $mday";
# $mon=9, $mday=18 gives "Oct 18"
$year is the number of years since 1900, not just the last two digits of the year. That is, $year is 123 in year 2023. The proper way to get a complete 4-digit year is simply:
$year += 1900;
To get the last two digits of the year (e.g., '01' in 2001) do:
$year = sprintf("%02d", $year % 100);
$wday is the day of the week, with 0 indicating Sunday and 3 indicating Wednesday. $yday is the day of the year, in the range 0..364 (or 0..365 in leap years.)
$isdst is true if the specified time occurs during Daylight Saving Time, false otherwise.