从日期中获取日期并在 1 到 9 位数中附加 0

从日期中获取日期并在 1 到 9 位数中附加 0

我正在使用 awk 命令获取文件的创建日期,并从中获取日、月和年,但对于 1-9 位数字,我得到的输出如下2016041但我想要输出20160401

D=$(ls -ltr $line | awk '{print $7}') 

M=$(ls -ltr $line | awk '{print $6}')

 Y=$(date +"%Y")

TEMP2="$Y$M$D"

答案1

正确地执行此操作ls很尴尬,因为日期格式会随着文件的年龄而变化。此外, 的计算$M是可疑的,因为ls通常返回月份的名称而不是数字。据推测,OP 使用该date命令来尝试解决ls日期格式的差异,但这意味着所有文件将在一年内获得相同的值。

然而,OP 的问题集中在前导零上。 部分很简单awk

D=$(ls -ltr $line | awk '{printf "%02d", $7}')
M=$(ls -ltr $line | awk '{printf "%02d", $6}')
Y=$(date +"%Y")

如果我必须在 HPUX 上执行此操作,我会考虑使用 Perl(预装的),因为这可以避免ls日期格式的问题。

这是一个简单的例子(man perlfunc是从哪里开始):

#!/usr/bin/perl -w

use strict;

for my $n ( 0 .. $#ARGV ) {
    my (
        $dev,  $ino,   $mode,  $nlink, $uid,     $gid, $rdev,
        $size, $atime, $mtime, $ctime, $blksize, $blocks
    ) = stat( $ARGV[$n] );
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
      localtime($mtime);

    # printf "%s:", $ARGV[$n];
    printf "%04d%02d%02d", 1900 + $year, 1 + $mon, $mday;

    # printf "\n";
}
1;

我检查了脚本,其中有两个printf未注释的语句,并查看了示例文件。您可以仅使用一个文件名来调用此脚本(对于多个文件名,缺乏格式将是一件麻烦事)。

答案2

也可以使用 添加前导零printf好像可以用在 HP-UX 中。

D=$(ls -ltr $line | awk '{print $7}') 
M=$(ls -ltr $line | awk '{print $6}')
Y=$(date +"%Y")
TEMP2="`printf '%02d%02d%04d' $D $M $Y`"

相关内容