我想找出特定文件的创建日期,而不是修改日期或访问日期。
我已经尝试过ls -ltrh和stat filename。
我刚刚阅读了 的Birth部分,stat似乎 ext4 应该支持它,但即使是我刚刚创建的文件也将其留空。
~ % touch test slave-iv
~ % stat test.pl slave-iv
File: ‘test.pl’
Size: 173 Blocks: 8 IO Block: 4096 regular file
Device: 903h/2307d Inode: 41943086 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/xenoterracide) Gid: ( 100/ users)
Access: 2012-09-22 18:22:16.924634497 -0500
Modify: 2012-09-22 18:22:16.924634497 -0500
Change: 2012-09-22 18:22:16.947967935 -0500
Birth: -
~ % sudo tune2fs -l /dev/md3 | psp4 slave-iv
tune2fs 1.42.5 (29-Jul-2012)
Filesystem volume name: home
Last mounted on: /home
Filesystem UUID: …Run Code Online (Sandbox Code Playgroud) 
如果您查看STAT column上图,您会看到Ss S S< SN and R+
这表示什么?Process states. 如果是,那么意义'Ss S< SN and R+'何在?
我正在使用的应用程序不会以以下用户消息开头: [Errno 13] Permission denied: '/home/sleblanc/.config/app/.config
当我使用时ls,文件显示如下:
?--------- 1 root root 0 Dec 31 1969 .config
Run Code Online (Sandbox Code Playgroud)
在文件上运行 stat 给了我这个:
% stat .config
File: .config
Size: 0 Blocks: 0 IO Block: 4096 weird file
Device: 2dh/45d Inode: 9799944 Links: 1
Access: (0666/?rw-rw-rw-) Uid: ( 1000/ sleblanc) Gid: ( 1000/ sleblanc)
Access: 1969-12-31 19:00:00.000000000 -0500
Modify: 1969-12-31 19:00:00.000000000 -0500
Change: 2018-04-07 23:40:22.549653691 -0400
Run Code Online (Sandbox Code Playgroud)
最令人惊讶的是这里提到了一个“奇怪的文件”。
什么是奇怪的文件?
很长一段时间以来,Linux 都没有为文件创建日期而烦恼,因为它常用的文件系统都不支持它们。但是现在,常用的 2 个文件系统(NTFS 和 ext4)都记录文件创建日期。
stat然而,该命令仍然Birth: -在 ext4 文件系统上输出,即使我们可以看到 ext4 使用debugfs -R 'stat <inode_number>' /dev/file_device.
当我调查这是为什么时,我看到其他人最近已经提交了一份关于它的错误报告,并且响应链接到一个上游问题,该问题只是指出“目前没有 Linux 内核接口来获取该信息 [文件创立日期]”。在我看来,这显然仍然如此,因为人们多年来一直要求stat显示此信息(并且stat确实输出一个Birth字段,即使它显然不支持它!他们是否在预期中添加了它?)
那么目前是否还没有Linux内核接口来获取文件创建日期?有计划实施吗?
我想使用该stat命令来获取有关文件的信息。我这样做了:
Josephs-MacBook-Pro:Desktop Joseph$ echo 'hello' > info.txt
Josephs-MacBook-Pro:Desktop Joseph$ stat info.txt
16777220 21195549 -rw-r--r-- 1 Joseph staff 0 6 "Dec 21 20:45:31 2014" "Dec 21 20:45:30 2014" "Dec 21 20:45:30 2014" "Dec 21 20:45:30 2014" 4096 8 0 info.txt
Run Code Online (Sandbox Code Playgroud)
第 3 行和第 4 行是我得到的输出。每当我使用stat命令时都会发生这种情况。与此同时,互联网上的每个人都会得到类似的东西:
File: `index.htm'
Size: 17137 Blocks: 40 IO Block: 8192 regular file
Device: 8h/8d Inode: 23161443 Links: 1
Access: (0644/-rw-r--r--)
Uid: (17433/comphope) Gid: ( 32/ www)
Access: 2007-04-03 09:20:18.000000000 -0600
Modify: 2007-04-01 23:13:05.000000000 …Run Code Online (Sandbox Code Playgroud) 我用来stat -f %m .bashrc在 osx 上获取我的 .bashrc 的修改时间。但是当我在 ubuntu 上运行相同的命令时,它吐出错误:
stat: cannot read file system information for %m': No such file or directory
有没有兼容的方法来实现这一目标?
我正在创建一个通用的编译/转译系统。了解文件是否已经编译/转译的一种方法是比较源文件和目标文件的修改日期。
我需要编写一个可以做到这一点的 bash 脚本:
source_file=foo;
target_file=bar;
stat_source=$(stat source_file);
stat_target=$(stat target_file);
Run Code Online (Sandbox Code Playgroud)
但是如何从统计输出中提取日期并进行比较?有没有比stat比较文件的最近修改时间更好的方法?
如果我在日志文件上调用 stat ,我会得到:
16777220 12391188 -rw-r--r-- 1 alexamil staff 0 321 "Jun 22 17:45:53 2017" "Jun 22 17:20:51 2017" "Jun 22 17:20:51 2017" "Jun 22 15:40:19 2017" 4096 8 0 test.log
Run Code Online (Sandbox Code Playgroud)
AFAICT,时间粒度不超过秒。如果可能的话,我需要得到比这更细粒度的东西。
想象两个进程,一个读取器和一个写入器,通过 ext3 fs 上的常规文件进行通信。ReaderIN_MODIFY对文件有一个 inotify监视。Writer 在一次write()调用中将 1000 个字节写入文件。Reader 获取 inotify 事件,并调用fstat文件。读者看到了什么?
是否有任何保证 Reader 将至少获得 1000 美元st_size的文件?从我的实验来看,似乎不是。
有没有保证 Reader 实际上可以read()1000 个字节?
这发生在严重的 I/O 绑定框上。例如,sar显示大约 1 秒的等待时间。在我的情况下,Reader 在调用之前获得 inotify 事件后实际上等待了 10 秒stat,并且得到的结果太小。
我曾希望在文件准备好之前不会传递 inotify 事件。我怀疑实际发生的是 inotify 事件write()在 Writer 中的调用期间触发,并且只要数据准备就绪,系统上的其他进程实际上都可以使用该数据。在这种情况下,10 秒是不够的。
我想我只是想确认内核实际上按照我猜测的方式实现了 inotify。另外,如果有任何选择,可能会改变这种行为?
最后-考虑到这种行为,inotify 的意义何在?无论如何,在您获得事件后,您将不得不轮询文件/目录,直到数据实际可用为止。不妨一直这样做,而忘记 inotify。
*** 编辑 ** * * 好吧,正如经常发生的那样,我看到的行为实际上是有道理的,现在我明白了我真正在做什么。^_^
我实际上是在响应文件所在目录上的 IN_CREATE 事件。所以我实际上是在 stat()'ing 文件以响应文件的创建,不一定是 IN_MODIFY 事件,它可能稍后到达。
我将更改我的代码,以便在收到 IN_CREATE 事件后,我将订阅文件本身的 IN_MODIFY,并且在收到 IN_MODIFY 事件之前我不会实际尝试读取文件。我意识到那里有一个小窗口,我可能会错过对文件的写入,但这对我的应用程序来说是可以接受的,因为在最坏的情况下,文件将在最大秒数后关闭。
我想从 bash 脚本检查文件的组权限。具体来说,我需要检查文件是否具有组可写位。
就是这样。就那么简单。然而:
test -w <file 不会告诉我它是否是组可写的。ls -ld对人类很好,但对脚本不太确定。从技术上讲,我可以解析输出,例如drwxrwxr-x提取组位,但这似乎很脆弱。statOS X 和其他系统之间的接口完全不兼容。find <file> -perm ... 不可能是答案?stat ×10
files ×4
filesystems ×3
timestamps ×3
bash ×2
linux ×2
portability ×2
ext4 ×1
inotify ×1
ls ×1
osx ×1
permissions ×1
process ×1
ps ×1