2015-06-20 64 views
2

我正在处理一个进程,需要在对指定目录中的任何文件进行任何更改时重新进行递归。如何在目录中找到最新修改文件的时间戳(递归)?

我想避免使用任何重物,如inotify。我不需要知道哪些文件已更新,而只需要了解是否更新了文件。此外,我不需要通知每一个变化,而只需要知道在特定时间间隔内是否发生了任何变化,这是由过程动态决定的。

必须有办法用一个相当简单的bash命令来做到这一点。我不介意多次执行命令;性能不是我对这个用例的主要关注。但是,命令的速度越快越好。

我唯一需要的输出是最后改变的时间戳,这样我就可以把它比作我已存储在内存中的时间戳。

我也开到更好的解决方案。

+0

_upon任何改变,任何_文件 - >我还需要了解新的文件。删除的文件将是奖金,但不是必需的。跟踪这些可能也很困难。做目录的校验和会起作用,但可能会很慢。 –

回答

1

我只是想一个更好的解决方案比the previous one ,这也让我知道被删除的文件。

的想法是使用校验,但不是所有文件的校验;相反,我们只能对时间戳进行校验。如果有任何更改(新文件,删除文件,修改文件),那么校验和也会改变!

find . -type f -printf '%[email protected],' | cksum

  1. '%[email protected],'返回每个文件作为Unix时间戳的修改时间,所有在同一行上。
  2. cksum计算时间戳的校验和。
  3. ?????
  4. 利润!

它实际上甚至更快比以前的溶液(〜20%),因为我们不需要排序(这是最慢的操作之一)。即使是校验和也会更快,特别是对于如此少量的数据(每个时间戳22个字节),而不是对每个文件执行校验和。

+1

替代校验和:'md5sum',或SHA系列之一('shasum','sha1sum','sha512sum'等)。 'cksum'在安全性不是问题的情况下很好(这不是我的用例),否则应该使用'sha512sum'。 –

2

我居然找到一个很好的答案,从another closely related question

我只修改了命令一点,以使其适应我的需求:

find . -type f -printf '%[email protected]\n' | sort -n | tail -1

  1. %[email protected]返回修改时间为UNIX时间戳,这正是我需要的。
  2. sort -n数字排序的时间戳。
  3. tail -1仅保存最后/最高时间戳。

这还算跑得快;我的整个家目录〜400ms,预期目录~30ms(使用time [command]测量)。

+0

〜400ms在131,766个文件上,〜30ms在9387个文件上。所以,每1000个文件〜3ms。 –

+0

使用['find。 -type f | wc -l'](http://superuser.com/questions/198817/recursively-count-all-the-files-in-a-directory) –

-1

$找到./ -name“* .sqlite” -ls 在这里你可以使用这个命令来获取信息为您的文件。使用过滤器,以获得时间戳

+0

我需要跟踪_任何更改为任何file_;我没有我想用'-name'跟踪的特定文件。我也需要知道新文件。 –

+0

ohh抱歉没有正确读取它,但这更简单,因为您只需要grep特定目录中的文件的时间戳并比较那里的时间戳。你可以编写一个简单的shell脚本来完成下面的步骤,可以满足你的任务1. grep时间戳来自目录中的所有文件2.将它放在一个数组中,并将它比较得到最新的时间戳并获得相应的目录 – user3156262

+0

我不需要所有文件的时间戳,但只有最新的一个。 _“我需要的唯一输出是最后一次更改的时间戳,因此我可以将其与我已经存储在内存中的时间戳进行比较。”_我发现接受的答案更容易实现该目标。 –

相关问题