![从日期中获取日期并在 1 到 9 位数中附加 0](https://linux22.com/image/87335/%E4%BB%8E%E6%97%A5%E6%9C%9F%E4%B8%AD%E8%8E%B7%E5%8F%96%E6%97%A5%E6%9C%9F%E5%B9%B6%E5%9C%A8%201%20%E5%88%B0%209%20%E4%BD%8D%E6%95%B0%E4%B8%AD%E9%99%84%E5%8A%A0%200.png)
我正在使用 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`"