我正在处理一个需要在递归地对指定目录中的任何文件进行任何更改时重新启动的进程。
我想避免使用任何重物,例如inotify
。我不需要知道哪些文件已更新,而只需知道文件是否已更新。此外,我不需要收到每个更改的通知,而只是知道是否在特定时间间隔内发生了任何更改,由流程动态确定。
必须有一种方法可以使用相当简单的bash命令来完成此操作。我不介意多次执行命令;性能不是我对此用例的主要关注点。但是,命令最好尽可能快。
我需要的唯一输出是最后一次更改的时间戳,所以我可以将它与我存储在内存中的时间戳进行比较。
我也愿意接受更好的解决方案。
答案 0 :(得分:3)
我实际上从another closely related question找到了一个很好的答案。
我只是稍微修改了命令以使其适应我的需要:
find . -type f -printf '%T@\n' | sort -n | tail -1
%T@
将修改时间作为unix时间戳返回,这正是我需要的。sort -n
以数字方式对时间戳进行排序。tail -1
仅保留最后/最高时间戳。它运行得相当快;在我的整个主目录上约400毫秒,在目标目录上约30毫秒(使用time [command]
测量)。
答案 1 :(得分:2)
我只是想到了比the previous one更好的解决方案,这也让我了解了已删除的文件。
这个想法是使用校验和,但不是所有文件的校验和;相反,我们只能对时间戳进行校验和。如果有任何改变(新文件,删除文件,修改过的文件),那么校验和也会改变!
find . -type f -printf '%T@,' | cksum
'%T@,'
将每个文件的修改时间作为unix时间戳返回,全部在同一行。cksum
计算时间戳的校验和。它实际上甚至 更快 比之前的解决方案(约20%),因为我们不需要排序(这是一个最慢的操作)。即使校验和也会快得多,特别是在如此少量的数据(每个时间戳22个字节)上,而不是对每个文件进行校验和。
答案 2 :(得分:1)
您无需记住上一次更改的时间戳,而可以记住上一次更改的文件并使用查找新文件
find . -type f -newer "$lastfilethatchanged"
但是,如果同一文件再次更改,则此操作无效。因此,您可能需要首先使用touch
创建一个临时文件:
touch --date="$previoustimestamp" "$tempfile"
find . -type f -newer "$tempfile"
例如"$tempfile"
可能位于/dev/shm/
的内存中。
答案 3 :(得分:-1)
$ find ./ -name" * .sqlite" -ls 在这里,您可以使用此命令获取文件的信息。使用过滤器获取时间戳