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