日付から日付を取得し、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。ただし、これはすべてのファイルが1年以内に同じ値を取得することを意味します。

しかし、OPの質問は先行ゼロに焦点を当てています。 それ部分は簡単ですawk

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

HPUXでこれを行う必要がある場合は、ls日付形式の問題を回避するためにインストール済みのPerlを使用することをお勧めします。

以下は簡単な例です(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つあり、サンプルファイルを見ました。単一のファイル名でこのスクリプトを呼び出すことができます(複数のファイル名がある場合はフォーマットが不足すると問題になります)。

おすすめ記事