POSIX 셸에서 파일 수정 시간 가져오기

POSIX 셸에서 파일 수정 시간 가져오기

POSIX 기능만 사용하여 셸에서 파일 수정 시간을 가져올 수 있습니까? 초 단위의 유닉스 타임스탬프를 사용하는 것이 좋습니다.

내가 찾을 수 있는 모든 것은 그것을 사용 stat(1)하지만 POSIX에는 정의가 없는 것 같습니다. 가능합니까?

답변1

유감스럽게도 POSIX CLI(셸 및 유틸리티) 인터페이스는 lstat()stat()시스템 호출뿐이며 해당 출력을 안정적으로 후처리할 수 없습니다.ls

한 가지 방법은 명령과 해당 형식을 pax -x ustar지정하여 이를 포함하는 파일 을 생성 하고 해당 파일에서 타임스탬프를 추출하는 것입니다.paxustartar

echo "$((0$(pax -x ustar -wd -- "$file" |
    dd 2> /dev/null bs=4 skip=34 count=3 | tr -d '\0')))"

mtime오프셋 136에 8진수로 저장됩니다.

그러나 US-tar 형식의 모든 제한으로 인해 방해를 받습니다.

가장 좋은 방법은 다음을 사용하는 것 perl입니다 python.

perl -MPOSIX -le '
  for (@ARGV) {
    if (@s = lstat$_) {print $s[9]} else {warn "$_: $!\n"}
  }' -- "$file"

(많은 최신 시스템에서 사용할 수 있는 나노초는 포함되지 않습니다. 예를 들어 모듈을 통해 얻을 수 있지만 Time::HiRes이는 최신 버전에서 설치되었다고 가정합니다.)

답변2

POSIX 호환 운영 체제를 사용하고 있다면(귀하의 질문에서 추측한 것 같습니다) pax이를 사용하여 단 1초라도 얻을 수 있는 좋은 방법이 있습니다.

부르다:

pax -xpax -wd -- "$file" | dd 2> /dev/null skip=1 count=1 |
    grep ' mtime=' | sed 's/.*mtime=//'

전화하면:

pax -xpax -wd -- /etc/passwd | dd 2> /dev/null skip=1 count=1 |
    grep ' mtime=' | sed 's/.*mtime=//'

나는 얻다:

1572569707.797017689

답변3

계산하는 것은 매우 간단하지만 여기에 Python을 사용한 변형이 있습니다.

#-- cross-platform workaround, see https://unix.stackexchange.com/q/561927/3097
alias stat_mtime='python -c "print(__import__(\"os\").stat(__import__(\"sys\").argv[1]).st_mtime)"'

$ stat_mtime /dev/null
1624731195.3483574

관련 정보