날짜에서 날짜를 가져와 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의 질문은 선행 0에 중점을 둡니다. 저것부분은 간단합니다 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

앞에 0을 추가하는 것도 사용할 수 있습니다 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`"

관련 정보