주어진 파일의 나이를 얻으십시오

주어진 파일의 나이를 얻으십시오

주어진 파일의 수명을 얻는 방법(최소 일 수)은 무엇입니까?

ls -lh비슷한 명령을 잘 알고 있습니다 . 내가 원하는 것은 다음과 같이 작동합니다.

getfage <FILE> # prints out '12d' (12 days)

또한 Mac OS X에서도 사용하고 싶기 때문에 어느 정도 크로스 플랫폼이 필요하지만 주요 사용 사례는 Linux 상자에 있습니다.

노트

Linux는 생성 시간을 추적하지 않기 때문에 두 가지 솔루션을 찾고 있습니다. 하나는시간(리눅스) - 즉파일이 마지막으로 수정된 시간--Mac OS X용도 처리할 수 있습니다.시간또는 생성 시간.

답변1

OSX는 파일 생성을 추적하지만 대부분의 다른 유닉스는 그렇지 않으므로 파일이 생성된 후 얼마나 많은 시간이 지났는지 알 수 없습니다. 거의 모든 운영 체제에서 마지막 수정 이후 경과 시간을 얻을 수 있습니다.

ls출력을 구문 분석하는 것이 거의 불가능하다는 점을 제외하면 파일 수정 시간을 검색하는 휴대용 셸 유틸리티는 없습니다 . Linux에서 다음 명령은 파일의 수명을 인쇄합니다.

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

Linux stat -c %Y -- "$filename"에서는 date +%s -r "$filename".

OSX datestat명령은 다릅니다. 다음 명령을 사용할 수 있습니다.

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds
echo $((($(date +%s) - $(stat -t %s -f %m -- "$filename")) / 86400)) days

비임베디드 Linux 시스템 및 OSX에는 기본적으로 Perl이 설치되어 있습니다.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
perl -l -e 'print 86400 * -M $ARGV[0], " seconds"' "$filename"
perl -l -e '$mtime = (stat($ARGV[0]))[9]; print time - $mtime, " seconds"' -- "$filename"

답변2

Unix는 생성 날짜를 기록하지 않습니다. 사용 가능한 유일한 정보는 일반적으로 파일의 마지막 시간입니다.

  1. 방문함
  2. 수정됨
  3. 변경됨
  • access - 파일을 마지막으로 읽은 시간
  • 수정 - 파일이 마지막으로 수정된 시간(콘텐츠가 수정됨)
  • 변경됨 - 파일의 메타데이터가 마지막으로 변경된 날짜(예: 권한)

(이 답변에서)

이 명령을 사용하여 특정 파일과 관련된 날짜를 가져올 수 있습니다 stat.

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX 및 HFS

OSX를 사용하는 경우 해당 Unix에서 사용되는 파일 시스템은 다음과 같습니다.고주파 FS. 이것은 다른 Unix와 유사하게 파일 시스템에서 생성 날짜와 수정 시간 등을 유지하는 몇 안되는(내가 아는) 것 중 하나입니다.

발췌

파일 레코드는 CNID, 파일 크기, 3개의 타임스탬프(파일 생성 시간, 마지막 수정 시간, 마지막 백업 시간), 데이터의 첫 번째 파일 범위, 리소스 포크 및 확장자에 대한 포인터를 포함하여 파일에 대한 다양한 메타데이터를 저장합니다. 및 익스텐트 오버플로 파일에 있는 파일의 리소스 익스텐트 레코드입니다. 파일 레코드에는 Finder가 파일 작성자 코드, 유형 코드, 파일이 표시되어야 하는 창, 창에서의 위치 등 파일에 대한 속성을 저장하는 데 사용하는 두 개의 16바이트 필드도 저장됩니다.

타임스탬프

타임스탬프는 항상 파일 시스템에 저장되므로 타임스탬프를 통해 제공되는 시간 추적(EXT3, EXT4, XFS 등)에 따라 제한됩니다.

파일 시스템

궁금하다면 다음 Wikipedia 주제를 확인하세요.파일 시스템 비교. 여기에는 내가 알고 있는 가장 광범위한 파일 시스템 목록이 있을 뿐만 아니라 다양한 기능과 해당 파일 시스템에서 지원되는지 여부에 대한 상태가 나열된 멋진 테이블이 있습니다.

인용하다

답변3

Gilles의 답변을 바탕으로 다음은 파일 수명을 초 또는 오류 단위로 반환하는 bash 함수입니다.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}

답변4

그냥 출력을 원할 경우12일또는12일나는 이것을 사용합니다 ...

filename=/path/to/your/file.txt
now=$(date +%s)
modified=$(date -r "$filename" "+%s")
delta=$((now-modified))
printf 'Created %d days ago\n' $((delta/86400))
printf 'Created %dh:%dm:%ds ago\n' $((delta/3600)) $((delta%3600/60)) $((delta%60))

관련 정보