2013-02-12 25 views
47

Tôi đang sử dụng Bash trên Debian GNU/Linux 6.0. Có thể lấy ngày/giờ tạo tệp không? Không phải ngày/giờ sửa đổi. ls -lh a.txtstat -c %y a.txt cả hai chỉ cung cấp thời gian sửa đổi.Cách nhận ngày/giờ tạo tệp trong Bash/Debian?

+4

Bạn đang sử dụng một hệ thống tập tin mà thời gian tạo bản ghi? Hầu hết là không. –

+0

Xem http://askubuntu.com/questions/470134/how-to-find-the-creation-time-of-a-file –

Trả lời

63

Đáng tiếc là nhiệm vụ của bạn sẽ không thể nói chung, như chỉ có 3 giá trị thời gian riêng biệt được lưu trữ cho mỗi tập tin của bạn theo quy định của tiêu chuẩn POSIX (xem Base Definitions section 4.8 File Times Update)

Mỗi tập tin có ba biệt dấu thời gian được liên kết: thời gian truy cập dữ liệu cuối cùng, thời gian sửa đổi dữ liệu cuối cùng và thời gian tệp được thay đổi lần cuối vào trạng thái . Các giá trị này được trả về trong cấu trúc đặc trưng của cấu trúc struct stat, như được mô tả trong <sys/stat.h>.

EDIT: Như đã đề cập trong các nhận xét bên dưới, tùy thuộc vào siêu dữ liệu được sử dụng hệ thống tập tin có thể chứa ngày tạo tệp. Lưu ý tuy nhiên việc lưu trữ thông tin như vậy không phải là tiêu chuẩn. Tùy thuộc vào nó có thể dẫn đến vấn đề di chuyển di chuyển đến hệ thống tập tin khác, trong trường hợp một trong những thực sự được sử dụng bằng cách nào đó lưu trữ nó anyways.

+1

cảm ơn bạn đã tham khảo. – NoodleFolk

+0

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html –

+5

Tin buồn này. Nó sẽ rất hữu ích ngay bây giờ để xác định dễ dàng cho dù một tập tin đã bị xóa và tái tạo hoặc đã có tất cả cùng. – froggythefrog

5

Ngày/giờ tạo thường là không được lưu giữ. Vì vậy, không, bạn không thể.

12

Lưu ý rằng nếu bạn đã có hệ thống tệp được gắn với thời gian không hoạt động vì lý do hiệu suất, thì thời gian rảnh sẽ có khả năng hiển thị thời gian tạo. Cho rằng thời gian chờ kết quả trong một tăng hiệu suất lớn (bằng cách loại bỏ một đĩa ghi cho mỗi lần đọc một tập tin), nó có thể là một tùy chọn cấu hình hợp lý mà cũng cung cấp cho bạn các kết quả mà bạn muốn.

+0

Tôi không thể xác minh cho việc tăng hiệu suất, nhưng tôi đã đọc hướng dẫn về thời gian rảnh được đề xuất của SSD, vì vậy điều này đã hiệu quả đối với tôi. – jake

13

Câu trả lời của mikyra là tốt. Thực tế giống như những gì anh ấy nói.

[[email protected] test]$ stat test.txt 
    File: `test.txt' 
    Size: 0    Blocks: 8   IO Block: 4096 regular empty file 
Device: 802h/2050d  Inode: 588720  Links: 1 
Access: (0664/-rw-rw-r--) Uid: ( 500/ jason) Gid: ( 500/ jason) 
Access: 2013-03-14 01:58:12.000000000 -0700 
Modify: 2013-03-14 01:58:12.000000000 -0700 
Change: 2013-03-14 01:58:12.000000000 -0700 

nếu bạn muốn xác minh tệp đã được tạo trước, bạn có thể cấu trúc tên tệp của mình bằng cách thêm vào ngày tháng của hệ thống.

+6

Khi tôi làm stat myfile.txt, tôi nhận được một hàng khác: Sinh. Thật không may, nó không có giá trị. Tại sao hàng đó ở đó? – allyourcode

4

ls -i menus.xml

94490 menus.xml Ở đây số 94.490 đại diện inode

Sau đó làm một:

df -h

Filesystem   Size Used Avail Use% Mounted on 
/dev/mapper/vg-root 4.0G 3.4G 408M 90%/
tmpfs     1.9G  0 1.9G 0% /dev/shm 
/dev/sda1    124M 27M 92M 23% /boot 
/dev/mapper/vg-var 7.9G 1.1G 6.5G 15% /var 

Để tìm điểm lắp của hệ thống tập tin gốc "/", bởi vì các menu tập tin.xml là vào '/' có nghĩa là '/ dev/mapper/VG-root'

debugfs -R 'stat < 94.490>'/dev/mapper/VG-gốc

Kết quả có thể giống như một trong những dưới đây:

debugfs -R 'stat < 94.490>'/dev/mapper/vG-gốc

debugfs 1.41.12 (17-May-2010) 
Inode: 94490 Type: regular Mode: 0644 Flags: 0x0 
Generation: 2826123170 Version: 0x00000000 
User:  0 Group:  0 Size: 4441 
File ACL: 0 Directory ACL: 0 
Links: 1 Blockcount: 16 
Fragment: Address: 0 Number: 0 Size: 0 
ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013 
atime: 0x5266e47b -- Wed Oct 23 09:47:55 2013 
mtime: 0x5266e438 -- Wed Oct 23 09:46:48 2013 
Size of extra inode fields: 4 
Extended attributes stored in inode body: 
    selinux = "unconfined_u:object_r:usr_t:s0\000" (31) 
BLOCKS: 
(0-1):375818-375819 
TOTAL: 2 

Nơi bạn có thể xem thời gian sáng tạo:

ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013 
+13

ctime không phải là thời gian tạo, đó là "thời gian sửa đổi lần cuối thông tin trạng thái tệp" – mokalan

+2

ctime = "thay đổi thời gian", nơi thay đổi có nghĩa là sửa đổi chủ sở hữu, nhóm, đặc quyền hoặc một số thuộc tính khác. Nó không nhất thiết là thời gian tạo ra. – ingyhere

+0

nó là crtime và không ctime .. nhưng cảm ơn! – Zibri

31
ls -i file #output is for me 68551981 
debugfs -R 'stat <68551981>' /dev/sda3 # /dev/sda3 is the disk on which the file exists 

#results - crtime value 
[[email protected] ~]# debugfs -R 'stat <68551981>' /dev/sda3 
debugfs 1.41.12 (17-May-2010) 
Inode: 68551981 Type: regular Mode: 0644 Flags: 0x80000 
Generation: 769802755 Version: 0x00000000:00000001 
User:  0 Group:  0 Size: 38973440 
File ACL: 0 Directory ACL: 0 
Links: 1 Blockcount: 76128 
Fragment: Address: 0 Number: 0 Size: 0 
ctime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013 
atime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013 
mtime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013 
**crtime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013** 
Size of extra inode fields: 28 
EXTENTS: 
(0-511): 352633728-352634239, (512-1023): 352634368-352634879, (1024-2047): 288392192-288393215, (2048-4095): 355803136-355805183, (4096-6143): 357941248-357943295, (6144 
-9514): 357961728-357965098 
+1

ý nghĩa của ctime, atime và mtime là gì? –

+1

@Velthune Thời gian tạo, thời gian truy cập, thời gian sửa đổi. Tuy nhiên tùy thuộc vào cách hệ thống tập tin được cấu hình các giá trị này có thể hoặc có thể không chính xác. Ví dụ, nhiều người vô hiệu hóa ghi thời gian truy cập cuối cùng vào các tập tin để lưu trên đĩa ghi thêm. – indivisible

+11

@indivisible: FALSE! Các tiêu chuẩn POSIX định nghĩa ctime là thời gian thay đổi. Đây là khi một số thuộc tính tệp thay đổi, nói chung. – ingyhere

1

Khi @mikyra giải thích, thời gian tạo ngày không được lưu trữ ở bất kỳ đâu.

Tất cả các phương pháp trên là tốt đẹp, nhưng nếu bạn muốn nhanh chóng có được chỉ qua sửa đổi ngày, bạn có thể gõ:

ls -lit /path 

với -t tùy chọn mà bạn liệt kê tất cả tập tin trong/path vừa đặt hàng cuối cùng bởi sửa đổi ngày.

1

Nếu bạn thực sự muốn đạt được điều đó, bạn có thể sử dụng trình xem tệp như inotifywait.

Bạn xem một thư mục và lưu thông tin về các tệp sáng tạo trong tệp riêng biệt bên ngoài thư mục đó.

while true; do 
    change=$(inotifywait -e close_write,moved_to,create .) 
    change=${change#./ * } 
    if [ "$change" = ".*" ]; then ./scriptToStoreInfoAboutFile; fi 
done 

Vì không có thời gian tạo được lưu trữ, bạn có thể xây dựng hệ thống của riêng mình dựa trên inotify.

1

Bạn có thể tìm thời gian tạo - còn gọi là thời gian sinh - sử dụng stat và cũng khớp với sử dụng tìm.
Chúng tôi có những tập tin hiển thị thời gian sửa đổi lần cuối:

$ ls -l --time-style=long-iso | sort -k6 
total 692 
-rwxrwx---+ 1 XXXX XXXX 249159 2013-05-31 14:47 Getting Started.pdf 
-rwxrwx---+ 1 XXXX XXXX 275799 2013-12-30 21:12 TheScienceofGettingRich.pdf 
-rwxrwx---+ 1 XXXX XXXX 25600 2015-05-07 18:52 Thumbs.db 
-rwxrwx---+ 1 XXXX XXXX 148051 2015-05-07 18:55 AsAManThinketh.pdf 

Để tìm các file được tạo ra trong một khung thời gian nhất định sử dụng tìm như dưới đây.
Rõ ràng, hệ thống tập tin biết về thời gian ra đời của một file:

$ find -newerBt '2014-06-13' ! -newerBt '2014-06-13 12:16:10' -ls 
20547673299906851 148 -rwxrwx--- 1 XXXX XXXX 148051 May 7 18:55 ./AsAManThinketh.pdf 
1407374883582246 244 -rwxrwx--- 1 XXXX XXXX 249159 May 31 2013 ./Getting\ Started.pdf 


Chúng ta có thể khẳng định điều này bằng stat:

$ stat -c "%w %n" * | sort 
2014-06-13 12:16:03.873778400 +0100 AsAManThinketh.pdf 
2014-06-13 12:16:04.006872500 +0100 Getting Started.pdf 
2014-06-13 12:16:29.607075500 +0100 TheScienceofGettingRich.pdf 
2015-05-07 18:32:26.938446200 +0100 Thumbs.db 


stat người đàn ông trang giải thích% w:

%w  time of file birth, human-readable; - if unknown 
0

Trích dẫn từ https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347, sau đây cô ấy llscript sẽ làm việc để có được thời gian tạo:

get_crtime() { 
    for target in "${@}"; do 
     inode=$(stat -c %i "${target}") 
     fs=$(df "${target}" | tail -1 | awk '{print $1}') 
     crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | grep -oP 'crtime.*--\s*\K.*') 
     printf "%s\t%s\n" "${target}" "${crtime}" 
    done 
} 
0

thậm chí tốt hơn:

lsct() 
{ 
    debugfs -R 'stat <'`ls -i "$1" | (read a b;echo -n $a)`'>' `df "$1" | (read a; read a b; echo "$a")` 2> /dev/null | grep --color=auto crtime | (read a b c d; 
    echo $d) 
} 

lsct/etc

Wed Jul 20 19:25:48 2016