Mar*_*Roy 6 linux filesystems bash find
我正在处理一个需要在对指定目录中的任何文件进行任何更改时以递归方式重新启动的进程。
我想避免使用任何沉重的东西,比如inotify. 我不需要知道哪些文件被更新,而只需要知道文件是否被更新。此外,我不需要收到每次更改的通知,而只需要知道在特定时间间隔内是否发生了任何更改,由流程动态确定。
必须有一种方法可以使用相当简单的 bash 命令来做到这一点。我不介意多次执行命令;性能不是我对这个用例的主要关注点。但是,命令越快越好。
我需要的唯一输出是上次更改的时间戳,因此我可以将其与存储在内存中的时间戳进行比较。
我也愿意接受更好的解决方案。
我实际上从另一个密切相关的问题中找到了一个很好的答案。
我只是稍微修改了命令以使其适应我的需要:
find . -type f -printf '%T@\n' | sort -n | tail -1
%T@ 将修改时间作为 unix 时间戳返回,这正是我所需要的。sort -n 以数字方式对时间戳进行排序。tail -1 只保留最后/最高时间戳。它运行得相当快;在我的整个主目录上约 400 毫秒,在预期目录上约 30 毫秒(使用 测量time [command])。
我只是想到了一个比前一个更好的解决方案,它也可以让我知道已删除的文件。
这个想法是使用校验和,但不是所有文件的校验和;相反,我们只能对时间戳进行校验和。如果有任何改变(新文件、删除文件、修改文件),那么校验和也会改变!
find . -type f -printf '%T@,' | cksum
'%T@,'以 unix 时间戳形式返回每个文件的修改时间,全部位于同一行。cksum计算时间戳的校验和。它实际上比以前的解决方案更快(约 20%),因为我们不需要排序(这是最慢的操作之一)。即使是校验和也会快得多,特别是对于如此少量的数据(每个时间戳 22 个字节),而不是对每个文件进行校验和。