如何在目录中找到最新修改文件的时间戳(递归)?
Posted
技术标签:
【中文标题】如何在目录中找到最新修改文件的时间戳(递归)?【英文标题】:How to find the timestamp of the latest modified file in a directory (recursively)? 【发布时间】:2015-09-06 17:15:55 【问题描述】:我正在处理一个需要在对指定目录中的任何文件进行任何更改时以递归方式重新启动的进程。
我想避免使用任何沉重的东西,例如inotify
。我不需要知道哪些文件已更新,而只需要知道文件是否已更新。此外,我不需要每次更改都被通知,而只需知道是否在特定时间间隔内发生了任何更改,由流程动态确定。
必须有一种方法可以使用相当简单的 bash 命令来完成此操作。我不介意多次执行命令;性能不是我对这个用例的主要关注点。但是,最好让命令尽可能快。
我需要的唯一输出是上次更改的时间戳,因此我可以将它与我存储在内存中的时间戳进行比较。
我也愿意接受更好的解决方案。
【问题讨论】:
对任何文件进行任何更改 -> 我还需要了解新文件。删除的文件将是一个奖励,但不是必需的。跟踪这些也可能要困难得多。对目录进行校验和会起作用,但可能会很慢。 【参考方案1】:其实我从another closely related question找到了一个很好的答案。
我只是稍微修改了命令以使其适应我的需要:
find . -type f -printf '%T@\n' | sort -n | tail -1
%T@
将修改时间作为 unix 时间戳返回,这正是我所需要的。
sort -n
按数字对时间戳进行排序。
tail -1
只保留最后/最高的时间戳。
它运行得相当快;在我的整个主目录上约 400 毫秒,在预期目录上约 30 毫秒(使用time [command]
测量)。
【讨论】:
在 131,766 个文件上约为 400 毫秒,在 9387 个文件上约为 30 毫秒。因此,每 1000 个文件约 3 毫秒。 使用find . -type f | wc -l
计数【参考方案2】:
我只是想到了一个比the previous one 更好的解决方案,它还可以让我了解已删除的文件。
这个想法是使用校验和,但不是所有文件的校验和;相反,我们只能对时间戳进行校验和。如果有任何改变(新文件、删除文件、修改文件),那么校验和也会改变!
find . -type f -printf '%T@,' | cksum
'%T@,'
以 unix 时间戳的形式返回每个文件的修改时间,都在同一行。
cksum
计算时间戳的校验和。
????
利润!!!!
它实际上比之前的解决方案更快(大约 20%),因为我们不需要排序(这是最慢的操作之一)。即使是校验和也会快得多,尤其是对于如此少量的数据(每个时间戳 22 个字节),而不是对每个文件进行校验和。
【讨论】:
替代校验和:md5sum
,或 SHA 系列之一(shasum
、sha1sum
、sha512sum
等)。 cksum
在不考虑安全性的情况下很好(它不适合我的用例),否则可能应该使用 sha512sum
。【参考方案3】:
您可以记住上次更改的文件并使用查找更新的文件,而不是记住上次更改的时间戳
find . -type f -newer "$lastfilethatchanged"
但是,如果同一个文件再次更改,这将不起作用。因此,您可能需要先使用touch
创建一个临时文件:
touch --date="$previoustimestamp" "$tempfile"
find . -type f -newer "$tempfile"
例如,"$tempfile"
可能位于内存中的/dev/shm/
。
【讨论】:
【参考方案4】:$ find ./ -name "*.sqlite" -ls 在这里,您可以使用此命令获取文件信息。使用过滤器获取时间戳
【讨论】:
我需要跟踪对任何文件的任何更改;我没有要使用-name
跟踪的特定文件。我还需要了解新文件。
哦,抱歉没有正确阅读,但这更简单,因为您只需要 grep 特定目录中文件的时间戳并在那里比较时间戳。您可以为此编写一个简单的 shell 脚本,以下步骤可能足以满足您的任务 1. 从目录中的所有文件中提取时间戳 2. 将其放入一个数组中并进行比较以获取最新的时间戳并获取相应的目录
我不需要所有文件的时间戳,只需要最新的一个。 “我需要的唯一输出是上次更改的时间戳,因此我可以将它与我存储在内存中的时间戳进行比较。” 我发现接受的答案更容易实现该目标。
是的,我明白了。我是说你可以为此目的编写 shell 脚本以上是关于如何在目录中找到最新修改文件的时间戳(递归)?的主要内容,如果未能解决你的问题,请参考以下文章