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`"