如何获取给定文件的使用期限(至少几天)?
我很清楚ls -lh
类似的命令。我想要的东西会像这样工作:
getfage <FILE> # prints out '12d' (12 days)
另外,这需要在某种程度上是跨平台的,因为我也想在 Mac OS X 下使用它,但主要用例是在我的 Linux 机器上。
笔记
由于 Linux 不跟踪创建时间,我正在寻找两重解决方案:一是时间(linux)——也就是说上次修改该文件的时间--还有一个适用于 Mac OS X,它可以处理时间或创建时间。
答案1
OSX 会跟踪文件创建,但大多数其他 unice 不会,因此无法知道自文件创建以来所经过的时间。您几乎可以在任何操作系统上获取自上次修改以来经过的时间。
没有可移植的 shell 实用程序来检索文件的修改时间,除非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"
.
OSXdate
和stat
命令是不同的。您可以使用以下命令:
echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds
echo $((($(date +%s) - $(stat -t %s -f %m -- "$filename")) / 86400)) days
非嵌入式 Linux 系统和 OSX 默认安装了 Perl。
perl -l -e 'print -M $ARGV[0], " days"' "$filename"
perl -l -e 'print 86400 * -M $ARGV[0], " seconds"' "$filename"
perl -l -e '$mtime = (stat($ARGV[0]))[9]; print time - $mtime, " seconds"' -- "$filename"
答案2
Unix 不记录创建日期。唯一可用的信息通常是文件的最后一次:
- 已访问
- 修改的
- 改变了
- 访问 - 上次读取文件的时间
- 修改——文件最后一次修改时间(内容已被修改)
- 更改 - 文件的元数据上次更改的时间(例如权限)
(从这个答案)
您可以使用该命令获取与特定文件相关的日期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 下使用的文件系统是高频FS。这是少数几个(据我所知)将创建日期以及修改时间等保留在文件系统中的之一,与其他 Unix 类似。
摘抄
文件记录存储有关文件的各种元数据,包括 CNID、文件大小、三个时间戳(文件创建时间、最后修改时间、最后备份时间)、数据的第一个文件范围以及资源分叉和指针到扩展区溢出文件中的文件的第一个数据和资源扩展区记录。文件记录还存储两个 16 字节字段,Finder 使用这些字段来存储有关文件的属性,包括文件的创建者代码、类型代码、文件应出现的窗口及其在窗口中的位置等内容。
时间戳
时间戳始终保存在文件系统中,因此您会受到通过它们提供的任何时间跟踪(EXT3、EXT4、XFS 等)的限制。
文件系统
如果您好奇,请查看这个维基百科主题,标题为:文件系统比较。它有我所知道的最广泛的文件系统列表,以及一个很好的表格,其中列出了各种功能以及给定文件系统中是否支持它的状态。
参考
答案3
根据 Gilles 的回答,这里有一个 bash 函数,它返回文件寿命(以秒为单位)或错误。
function fileAge
{
local fileMod
if fileMod=$(stat -c %Y -- "$1")
then
echo $(( $(date +%s) - $fileMod ))
else
return $?
fi
}
答案4
如果你只想要输出为12天或者12天我用这个...
filename=/path/to/your/file.txt
now=$(date +%s)
modified=$(date -r "$filename" "+%s")
delta=$((now-modified))
printf 'Created %d days ago\n' $((delta/86400))
printf 'Created %dh:%dm:%ds ago\n' $((delta/3600)) $((delta%3600/60)) $((delta%60))