전체 파일 날짜(GNU 유틸리티 제외)

전체 파일 날짜(GNU 유틸리티 제외)

다른 프로그램에 전달하기 위해 특정 파일의 전체 날짜(생성 또는 수정)를 얻으려고 합니다. 다양한 옵션과 함께 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-timeGNU ls또는 -D <format>FreeBSD 사용).ls

stat이 기능을 제공할 수 있는 다양한 호환되지 않는 명령 구현(IRIX, zsh내장, GNU, BSD)이 있습니다 .

-printf또는 GNU 조건자를 사용할 수도 있습니다 find. 아니면 -rGNU 옵션 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

http://cup.github.io/autumn/util/path/file-mtime

관련 정보