다른 프로그램에 전달하기 위해 특정 파일의 전체 날짜(생성 또는 수정)를 얻으려고 합니다. 다양한 옵션과 함께 ls 명령을 사용해 보았지만 그 중 어느 것도 6개월 미만의 파일에 대한 완전한 날짜를 제공하지 않으며 이러한 옵션 사용에 제한이 있습니다. 이 문제를 조사하기 위해 몇 가지 옵션을 시도하면 다음 메시지가 나타납니다.
usage: ls [-1ACFHLNRabcdefgilmnopqrstuxEUX] [File...]
내가 아는 한, 이들 중 어느 것도 내가 필요한 것을 제공하지 않는 것 같아서 stat 명령을 사용해 보았지만 작동하지 않았습니다.
저는 AIX 5.3에서 Korn 쉘을 사용하고 있으며 사용 가능한 명령이 제한되어 있습니다. 파일의 생성 또는 수정 날짜를 전체 날짜(dd/mm/yyyy 또는 yyyy/mm/)로 얻을 수 있는 다른 방법을 제안할 수 있는 사람이 있습니까? dd )).
답변1
를 사용하면 ls
항상 얻을 수 있는 것은 아니지만시간, 당신은 추론할 수 있어야합니다날짜(년 월 일).
C 로케일에서 날짜 출력은 가장 최근 파일에 대한 ls -l
것이어야 하며 Mmm dd HH:MM
(그리고 연도(올해 또는 전년도)를 내보낼 수 있어야 하거나 Mmm dd YYYY
이전 파일이나 향후 수정 시간이 있는 파일에 대한 것이어야 합니다. 따라서 항상 날짜 가져오기(YYYY-mm-dd)에서 내보낼 수 있어야 합니다.
eval "$(date +'year=%Y month=%m')"
LC_ALL=C ls -dln file | awk -v y="$year" -v m="$month" '{
month = index("--JanFebMarAprMayJunJulAugSepOctNovDec", $6) / 3
day = $7
if ($8 ~ /:/)
year = y - (month > m)
else
year = $8
printf "%04d-%02d-%02d\n", year, month, day
exit}'
이제 가장 높은 정확도로 전체 수정 시간을 원한다면 표준 명령이 없는 것이 유감입니다.
ls
해당 옵션이 포함된 일부 구현을 찾을 수 있습니다 (예: ls --full-time
GNU ls
또는 -D <format>
FreeBSD 사용).ls
stat
이 기능을 제공할 수 있는 다양한 호환되지 않는 명령 구현(IRIX, zsh
내장, GNU, BSD)이 있습니다 .
-printf
또는 GNU 조건자를 사용할 수도 있습니다 find
. 아니면 -r
GNU 옵션 date
.
모든 구현이 1초 미만의 세분성을 제공하는 것은 아닙니다. 주어진 출력은 모호할 수 있으며 선택한 형식과 현재 시간대에 따라 여러 가능한 날짜를 참조할 수 있으므로 시간대와 DST에 유의하세요.
심볼릭 링크의 경우 링크 또는 대상의 수정 시간인지 스스로에게 물어볼 수도 있습니다. 여기에 언급된 옵션 중 일부는 기본적으로 이들 중 하나를 수행하며 일부는 필요한 경우 그 중 하나를 수행하도록 지시할 수 있습니다.
zsh
통계:stat -F '%Y-%m-%d %T.%N %z' +mtime file
↳1992-05-13 14:57:00.123368710 +0100
- GNU
stat
:stat -c %y file
↳1992-05-13 14:57:00.123368710 +0100
- BSD
stat
:stat -t '%F %T %z' -f %Sm file
↳1992-05-13 14:57:00 +0100
- 아이릭스
stat
:stat -m file
- GNU
find
:find file -prune -printf '%TF %TT %Tz\n'
↳1992-05-13 14:57:00.1233687100 +0100
- GNU
date
:date -r file '+%F %T.%N %z'
↳1992-05-13 14:57:00.123368710 +0100
- FreeBSD
ls
:ls -D '[%F %T %z]' -l file
↳-r-xr-xr-x 2 bin bin 372298 [1992-05-13 14:57:00 +0100] file
- GNU
ls
:ls --full-time -l file
↳-r-xr-xr-x 2 bin bin 372298 1992-05-13 14:57:00.123368710 +0100 file
- 즉시 오픈
ls
:ls -Z '%(mtime:time=%F %T.%N %z)s'
↳1992-05-13 14:57:00.123368710 +0100
ls
귀하의 프로필에서 귀하가 사용 중일 것으로 제안하는 AIX에는 다음이 있습니다.istat
주문하다(AIX 5.3 매뉴얼 페이지), 전체 날짜를 표시하지만(forced가 아닌 이상 모호한 1초 미만의 세분성 없음 TZ
) UTC0
구문 분석하기가 쉽지 않습니다.
$ LC_ALL=C TZ=UTC0 istat file
Inode 10360 on device 10/6 File
Protection: r-xr-xr-x
Owner: 2(bin) Group: 2(bin)
Link count: 2 Length 372298 bytes
Last updated: Wed May 13 14:08:13 1992
Last modified: Wed May 13 13:57:00 1992
Last accessed: Sun Jan 31 15:49:23 1993
또한 심볼릭 링크의 경우 심볼릭 링크 자체가 아닌 심볼릭 링크 대상의 날짜를 가져옵니다.
이들 중 어느 것에도 액세스할 수 없는 경우 이식성을 위한 최선의 옵션은 다음과 같습니다 perl
.
$ perl -MPOSIX -le 'print strftime("%Y-%m-%d %T %z", localtime((lstat(shift))[9]))' file
1992-05-13 14:57:00 +0100
시스템이 거의 없다는 점에 유의하십시오.생성 시간파일의 경우(때때로출생 시간), 쿼리 명령은 물론이고 표준 API도 없어 수정 시점보다 상황은 더욱 심각하다.
답변2
GNU가 있는 경우 ls
:
ls --time-style=long-iso -l
또는
ls --time-style=+FMT -l
여기서 FMT는 date
명령 형식을 따릅니다. 귀하의 경우:
ls --time-style=+%Y/%m/%d -l
답변3
이를 수행하는 POSIX 함수는 다음과 같습니다.
mtime() {
touch -r "$1" /etc/fstab
diff -u /etc/fstab /dev/null | head -n 1 | cut -f 2
}
결과:
$ mtime ~/.profile
2019-07-01 06:25:34.000000000 -0500