POSIX 기능만 사용하여 셸에서 파일 수정 시간을 가져올 수 있습니까? 초 단위의 유닉스 타임스탬프를 사용하는 것이 좋습니다.
내가 찾을 수 있는 모든 것은 그것을 사용 stat(1)
하지만 POSIX에는 정의가 없는 것 같습니다. 가능합니까?
답변1
유감스럽게도 POSIX CLI(셸 및 유틸리티) 인터페이스는 lstat()
및 stat()
시스템 호출뿐이며 해당 출력을 안정적으로 후처리할 수 없습니다.ls
한 가지 방법은 명령과 해당 형식을 pax -x ustar
지정하여 이를 포함하는 파일 을 생성 하고 해당 파일에서 타임스탬프를 추출하는 것입니다.pax
ustar
tar
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