주어진 파일의 나이를 얻다


13

최소한 며칠 안에 특정 파일의 나이를 어떻게 알 수 있습니까?

나는 잘 알고 ls -lh있고 비슷한 명령을 알고 있습니다. 나는 이런 식으로 작동하는 것을 원한다.

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

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

노트

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



@slm 특별히 제작 시간에 관한 것입니다. 커맨드 라인에서 연령을 계산하지는 않습니다.
질 'SO-정지 존재 악마'


@terdon, 실제로는 아닙니다. 위의 참고를 참조하십시오 .
Alexej Magura

@ AlexejMagura 그리고 어떻게 dupe의 답변이 당신을 위해하지 않습니까? stat당신에게 필요한 모든 것을 제공합니까?
terdon

답변:


17

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

  1. 액세스
  2. 수정
  3. 변경
  • 액세스-파일을 마지막으로 읽은 시간
  • 수정-파일을 마지막으로 수정 한 시간 (콘텐츠가 수정 된 시간)
  • 변경-파일의 메타 데이터가 마지막으로 변경된 시간 (예 : 권한)

( 이 답변에서 )

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에서 사용되는 파일 시스템은 HFS 입니다. 이것은 다른 유닉스와 비슷한 수정 시간 등과 함께 파일 시스템 내에서 생성 날짜를 유지하는 몇 안되는 것 중 하나입니다.

발췌

파일 레코드는 CNID, 파일 크기, 3 개의 타임 스탬프 (파일 작성, 마지막 수정, 마지막 백업시), 데이터의 첫 번째 파일 범위 및 리소스 포크 및 포인터를 포함하여 파일에 대한 다양한 메타 데이터를 저장합니다. Extent Overflow File에있는 파일의 첫 번째 데이터 및 자원 범위 레코드. 파일 레코드는 또한 생성자 코드, 유형 코드, 파일이 표시되는 창 및 창 내 위치 등 파일에 대한 속성을 저장하기 위해 Finder에서 사용하는 두 개의 16 바이트 필드를 저장합니다.

타임 스탬프

타임 스탬프는 항상 파일 시스템에 유지되므로 타임 스탬프가 제공하는 시간 추적 (EXT3, EXT4, XFS 등)에 따라 제한됩니다.

파일 시스템

궁금한 점이 있으면이 위키 백과 주제 : 파일 시스템 비교을 살펴보십시오 . 그것은 내가 알고있는 가장 광범위한 파일 시스템 목록과 다양한 기능과 주어진 파일 시스템 내에서 지원되는지 여부의 상태를 보여줍니다.

참고 문헌


업데이트 해 주셔서 감사합니다. 사실, 본인은 여기 에서 ext4가 생성 날짜를 유지할 수 있지만 아직 커널에서 구현되지 않았습니다.
terdon

@terdon-예, 일부 파일 시스템에서 지원할 수 있습니다. 그것은 나에게 오랜 시간이 걸리는 것처럼 보입니다. 나는 과거에 왜 그것이 빠져 있었는지 이해하지만 처음부터 모든 것이 너무 발전하여 명시 적으로 이것을 갖지 않는 것은 합리적이지 않습니다. 또한 액세스 시간에 대한 지원을 비활성화하여 유사하게 구현 한 다음 원치 않는 경우 비활성화 할 수 있습니다.
slm

19

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

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

perl -l -e 'print -M $ARGV[0], " days"' "$filename"

OS 또는 파일 시스템에 따라 달라 집니까? Q & A는 파일 시스템이 파일 시스템을 유지하지만 커널이 파일 시스템에 액세스하는 방법을 제공해야 함을 암시하는 것 같습니다.
terdon

@ terdon-내 업데이트를 참조하십시오.
slm

@terdon 둘 다. 링크 한 Q & A가 정확하고 현재 파일 시스템이 한동안 생성 시간을 추적하고 있습니다. FreeBSD에서는 실제로 이것을 얻을 수 있습니다 stat. 리눅스에서는 syscall이 재 작업되지 않았으므로으로 해킹에 의지해야합니다 debugfs.
wingedsubmariner

1
@wingedsubmariner 파일 시스템의 생성 시간이 종종 응용 프로그램에서 생성 날짜가 아니라는 경고에주의하십시오. 많은 응용 프로그램이 create-new-then-move를 사용하여 대신 덮어 쓰기 대신 새 버전을 저장하는 방법으로 사용합니다.
Gilles 'SO- 악마 그만해

4

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

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

1
깔끔한 기능, 시간, 일, 주 단위로 나이를 볼 수있는 간단한 구분을 추가하여 쉽게 적응할 수 있습니다.
Emmanuel Devaux

0

stat -f%B, 을 사용 ls -lU하거나 mdls -n kMDItemFSCreationDateOS X에서 생성 (출생) 시간을 볼 수 있습니다 .

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.