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


104

수정 날짜 또는 액세스 날짜가 아닌 특정 파일의 생성 날짜를 찾고 싶습니다.

나는 함께 시도 ls -ltrh하고 stat filename.


5
Linux는 POSIX에 필요하지 않기 때문에 작성 시간을 추적하지 않습니다. 그러나 Mac OS X은 HFS 파일 시스템과 관련이 stat(1)있습니다.의 "생년월일"을 참조하십시오 .
200_ 성공

2
Fedora 19 ext4 파일 시스템은 파일 생성 시간을 설정합니다. 더 많은 예가 있다고 확신합니다. stap작성 시간을 검색 하는 데 사용 되는 아래 답변을 참조하십시오 .
rickhg12hs 2013 년

답변:


88

POSIX 표준 은 각 파일에 대해 세 가지 다른 타임 스탬프 ( 마지막 데이터 액세스 시간, 마지막 데이터 수정 시간 및 파일 상태가 마지막으로 변경된 시간) 만 정의합니다.

즉, ext4, Btrfs 및 JFS와 같은 최신 Linux 파일 시스템 은 파일 생성 시간 (일명 출생 시간)을 저장하지만 해당 필드에 다른 이름 ( crtimeext4, otimeBtrfs 및 JFS)을 사용합니다. 그러나 현재 Linux는 파일 생성 시간을 지원하는 파일 시스템에서도 파일 생성 시간에 액세스하기위한 커널 API를 제공하지 않습니다 .

으로 크레이그 샌더스모흐센 Pahlevanzadeh는 지적, stat지원 않습니다 %w%W(각각 인간이 읽을 수있는 형식과 원기 이후로 초 단위로 표시) 파일의 출생 시간을 표시하는 형식 지정합니다. 그러나 stat자체적 get_stat_birthtime()으로 gnulib (에서 제공)를 통해 출생 시간에 액세스합니다 . 이는 시스템 호출 로 반환 된 구조 및 필드 lib/stat-time.h에서 출생 시간을 가져옵니다 . 예를 들어 BSD 시스템 (및 확장 OS X)은를 통해 제공 하지만 Linux는 그렇지 않습니다. 이것이 내부적으로 작성 시간을 저장하는 파일 시스템의 경우에도 Linux에서 출력 (알 수없는 작성 시간을 표시)을 출력 하는 이유 입니다.st_birthtimest_birthtimensecstatstat()st_birthtimestatstat -c '%w' file-

으로 스테판 Chazelas가 지적 , 같은 NTFS-3g와 같은 일부 파일 시스템은 확장 파일 속성을 통해 파일 작성 시간을 노출합니다.


4
Linux에서는 이제 ext4를 포함한 많은 파일 시스템에 저장됩니다. 그래도 커널 API는 없습니다. ntfs-3g over fuse와 같은 일부 파일 시스템은 확장 속성 API를 통해 사용할 수 있습니다
Stéphane Chazelas

@StephaneChazelas 의견을 보내 주셔서 감사합니다. 자세한 내용을 제공하기 위해 답변을 업데이트했습니다.
Thomas Nyman

stap자체 커널 API를 만드는 데 사용할 수 있습니다 . 여기에 대한 답변의 예를 참조하십시오.
rickhg12hs 2013 년

26

TLDR; 사용 stap( "SystemTap의"를 자신의 커널 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가 바람직하지만이 스크립트는 훨씬 더 효율적으로 만들어지고 여러 파일 / 아이 노드의 생성 시간을 읽을 수 있습니다.

[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
$ 

4
좋아, 그냥 멋지다. stap을 사용하는 +1, 리눅스 커널을 패치하는 원숭이.
Chris Magnuson 2018 년

@ChrisMagnuson : 원숭이가 커널을 패치하지 않고 debugfs + stat얻을 수 crtime있습니다.
jfs

17

에서 ext4가능하다; ext4파일 시스템은 파일 생성 시간을 저장 하기 때문 입니다. 그러나 여전히 stat커널에 API가 없기 때문에 명령에 날짜를 표시 할 수 없다는 것을 알 수 있습니다.

어쨌든 파일 생성 시간이 저장되어 ext4있지만 직접적인 방법은 아니지만 사용하여 찾을 수 있습니다.debugfs

sudo debugfs -R "stat / ABSOLUTE / PATH"/ dev / sdxX | grep crtime


1
bash 함수로서 :xstat filename
jfs

1
경우 /dev/sdxX에 장착 /some/path하고, 파일이 /some/path/some/file지정되는 경로가 아니라 some/file: 그 경로는 파일 시스템의 루트에없는라고하지만, 마운트 지점에 있어야합니다. 그렇지 않으면 파일을 찾을 수 없습니다.
BowPark

15

이론적으로 GNU stat을 사용 하면 파일 생성 날짜 (일명 출생 시간)를 사용 stat -c '%w'하거나 %W얻을 수 있습니다 .

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

가장 근접한 것은 파일의 ctime이며 생성 시간 이 아니며 파일의 메타 데이터가 마지막으로 변경된 시간입니다.

Linux Weekly News는 몇 년 전에 흥미로운 기사를 보냈습니다 -http : //lwn.net/Articles/397442/


7
stat --printf='%w' yourfile   #human readable

stat --printf='%W' yourfile   #seconds from Epoch , 0 if unknown

차이 FreeBSDGNU\Linuxstat command:

당신이 호출 할 경우 stat에 명령 GNU\Linux그것을 호출 -x 옵션을하지만, FreeBSD의, 당신 자신은 호출해야합니다 -x옵션을 선택합니다.

Linux에서 어떤 파일 시스템이 작성 시간을 저장합니까?를 참조하십시오 .

참고 : .... --printf에서 매우 유용합니다 scripting!


//, CEntOS 6 컴퓨터에서 이것을 시도했는데 물음표 만 남았습니다. $ stat --printf = '% w'~ / dump.rdb? 내 파일 시스템이 % w의 통계를 지원하지 않을 수 있습니다.
Nathan Basanese

불행히도 HFS는 ctime을 지원하지 않습니다.
페르시아만

5

OS의 X에서 사용할 수있는 ls -lU, stat -f%B, GetFileInfo -d, 또는 mdls -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

2

이것 좀 봐:

# the last arg is the device to scan in.
debugfs -R 'stat /home/renich/somefile' /dev/sda1

BTW, 이것은 ext4에서만 작동합니다. BtrFS에 대한 해결책을 찾지 못했습니다 ... 아직;)


1
그것은 초보자 의 대답이 말한 것과 거의 비슷 합니다.
don_crissti

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