파일 생성 날짜를 얻는 방법은 무엇입니까?

파일 생성 날짜를 얻는 방법은 무엇입니까?

Linux 시스템에서 특정 파일의 생성 날짜를 알고 싶습니다. 수정되거나 액세스된 날짜가 아니라 생성된 날짜입니다.

나는 노력했지만 ls -ltrhstat filename에게 필요한 것을 제공하지 못했습니다. 이 정보를 얻으려면 또 무엇을 해야 합니까?

답변1

stat -c '%w' file생성 시간이 저장되는 파일 시스템에서.

Linux에서는 다음이 필요합니다.coreutils8.31, 2.28 glibc및 커널 버전 4.11 이상.

POSIX 표준은 다음을 정의합니다.세 가지 다른 타임스탬프각 파일별로 저장: 마지막 데이터 액세스 시간, 마지막 데이터 수정 시간, 마지막 파일 상태 변경 시간.

ext4, Btrfs, XFS와 같은 최신 Linux 파일 시스템(v5 이상) 및 JFS,저장파일 생성시간(생년월일이라고도 함) 관련 필드에는 다른 이름을 사용합니다( crtimeext4/XFS, otimeBtrfs 및 JFS). 리눅스가 제공하는통계(2)커널 버전 4.11부터 이를 지원하는 파일 시스템의 파일 생성 시간을 검색하기 위한 시스템 호출 인터페이스입니다. (따라서 파일 시스템에 생성 시 지원이 추가되더라도 일부 배포된 커널은 해당 파일 시스템 버전에 대한 명목상 지원이 추가된 후에도 기본적으로 이를 지원하지 않습니다.예를 들어 XFS v5.)

~처럼크레이그 샌더스그리고모센 팔완자데버전 8.31 이전에는 파일 생성 시간(각각 사람이 읽을 수 있는 형식 및 에포크 이후 초)을 표시하기 위해 및 형식 지정자가 stat실제로 지원 되었다는 점을 지적했습니다. 다만, 생년월일을 조회할 수 있는 시스템 호출은 8.31 버전부터 가능 하다. 버전 8.31 이전에는 시스템 호출에서 반환된 구조체의 합계 필드에서 출생 시간을 얻은 gnulib(in)을 통해 출생 시간에 액세스했습니다. 예를 들어 BSD 시스템(및 확장 OS X)은 via를 제공하지만 Linux는 그렇지 않습니다. 이것이 바로 Linux 8.31 이전에 생성 시간을 내부적으로 저장하는 파일 시스템의 경우에도 출력(알 수 없는 생성 시간을 나타냄)이 있는 이유입니다.%w%Wcoreutilscoreutils statstatx()coreutilsstatget_stat_birthtime()lib/stat-time.hst_birthtimest_birthtimensecstatstat()st_birthtimestatstat -c '%w' file-coreutils

~처럼스티븐 차제라스는 다음과 같이 지적합니다., 일부 파일 시스템(예: ntfs-3g)은 확장된 파일 속성을 통해 파일 생성 시간을 노출합니다.

답변2

너무 오래 사용함 stap("시스템 클릭") 자신만의 커널 API를 생성합니다. 아래는 ext4 생성 시간 추출 데모입니다.

Fedora 19 시스템에서 ext4 생성 시간을 추출할 수 있습니다. 이 내 꺼야:

$ uname -a
Linux steelers.net 3.11.1-200.fc19.i686.PAE #1 SMP Sat Sep 14 15:20:42 UTC 2013 i686 i686 i386 GNU/Linux

분명히 내 ext4 파티션의 inode에는 생성 시간이 있습니다. 다음은 파일 이름과 연관된 inode를 결정한 다음 ("systemtap")을 stat사용하여 stap생성 시간의 출력을 증가시키는 쉘 스크립트입니다 .

참고: 이것은 단지 데모일 뿐입니다.매우실행될 때마다 커널 모듈이 생성, 로드 및 언로드되기 때문에 비효율적입니다. 오류 검사가 수행되지 않기 때문에 이는 매우 취약할 수도 있습니다. 적절한 커널 API가 있으면 더 좋지만 이 스크립트를 더 효율적으로 만들고 여러 파일/inode의 생성 시간을 읽을 수 있습니다.

[stap_stat.sh 내용]

#/bin/sh

my_inode_str=$(stat --printf="%i" $1)

stap - << end_of_stap_script
global my_offsetof
probe begin {
  system("stat $1");
  my_offsetof = &@cast(0,"struct ext4_inode_info")->vfs_inode;
}
probe kernel.function("ext4_getattr@fs/ext4/inode.c") {
  probe_inode=\$dentry->d_inode;
  if (@cast(probe_inode, "struct inode")->i_ino == $my_inode_str) {
    my_i_crtime = &@cast(probe_inode - my_offsetof,"struct ext4_inode_info")->i_crtime;
    printf("CrTime: %s GMT\n", ctime(@cast(my_i_crtime, "timespec")->tv_sec));
    printf("CrTime (nsecs): %d\n", @cast(my_i_crtime, "timespec")->tv_nsec);
    exit();
  }
}
end_of_stap_script

다음은 데모입니다:

$ ll testfile
ls: cannot access testfile: No such file or directory
$ touch testfile
$ ./stap_stat.sh testfile
  File: ‘testfile’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 4850501     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/    Rick)   Gid: ( 1001/    Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:17:04.221441084 -0400
Modify: 2013-09-28 06:17:04.221441084 -0400
Change: 2013-09-28 06:17:04.221441084 -0400
 Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ ll testfile
-rw-rw-r--. 1 Rick Rick 0 Sep 28 06:17 testfile
$ cat - >> testfile 
Now is the time ...
$ ll testfile 
-rw-rw-r--. 1 Rick Rick 20 Sep 28 06:18 testfile
$ ./stap_stat.sh testfile
  File: ‘testfile’
Device: fd02h/64770d    Inode: 4850501     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/    Rick)   Gid: ( 1001/    Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:17:04.221441084 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:18:33.684374740 -0400
 Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ cat testfile 
Now is the time ...
$ ./stap_stat.sh testfile
  File: ‘testfile’
  Size: 20          Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 4850501     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/    Rick)   Gid: ( 1001/    Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:19:12.199349463 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:18:33.684374740 -0400
 Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ mv testfile testfile2
$ ./stap_stat.sh testfile2 
  File: ‘testfile2’
  Size: 20          Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 4850501     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/    Rick)   Gid: ( 1001/    Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:19:12.199349463 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:20:45.870295668 -0400
 Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ 

답변3

이론적으로 GNU 통계를 사용하면 파일의 생성 날짜(생년월일이라고도 함)를 얻 stat -c '%w'거나 얻을 수 있습니다.%W

실제로 대부분의 파일 시스템은 이 정보를 기록하지 않으며 Linux 커널은 이에 액세스할 수 있는 방법을 제공하지 않습니다.

얻을 수 있는 가장 가까운 것은 파일의 ctime입니다.아니요파일 메타데이터가 마지막으로 변경된 생성 시간입니다.

몇 년 전 Linux Weekly News에 이에 대한 흥미로운 기사가 ​​실렸습니다.파일 생성 시간.

답변4

ls -lUOS X에서는 , 또는 다음을 stat -f%B사용할 수 있습니다 .GetFileInfo -dmdls -n kMDItemFSCreationDate

$ ls -lU
total 0
-rw-r--r--  1 lauri  staff  0 Apr 25 03:58 a
$ stat -f%B a
1398387538
$ stat -f%SB -t %Y%m%d%H%M a
201404250358
$ GetFileInfo -d a
04/25/2014 03:58:58
$ mdls -n kMDItemFSCreationDate a
kMDItemFSCreationDate = 2014-04-25 00:58:58 +0000

관련 정보