将UNIX目录树结构放入JSON对象中

问题描述 投票:0回答:3

我正在尝试构建一个可视化文件结构的浏览器应用程序,因此我想将文件结构打印到JSON对象中。

我已经尝试使用许多通过管道传递给sed的'ls'变体,但是看起来find效果最好。

现在,我只是尝试使用命令

find ~ -maxdepth ? -name ? -type d -print

并标记路径变量

我已经使用PHP-exec尝试了简单的Ajax,但是数组遍历确实很慢。我当时想直接从bash脚本执行此操作,但是我无法弄清楚如何获取关联数组的传递引用以将所有标记化路径变量递归添加到树中。

是否有更好的或确定的方法可以做到这一点?

谢谢!

php javascript json filesystems unix
3个回答
1
投票

我不知道您的应用程序的要求是什么,但是解决您的问题(以及许多其他问题)的一种解决方案是将实际的文件系统布局隐藏在抽象层后面。

基本上,您编写两个线程。第一个抓取文件结构并创建其内容的数据库表示。第二个响应浏览器请求,查询第一个线程创建的数据库,并生成您的JSON(即普通的Web请求处理程序线程)。

通过抽象化底层存储结构(文件系统),您可以创建一个可以增加并发性,处理IO错误等的层。当某人更改结构中的文件时,Web客户端只有在“抓取器”可见后,该文件才可见线程检测到更改并更新数据库。但是,由于Web请求不依赖于读取底层文件结构而仅查询数据库,因此响应时间应该很快。

HTH,出生。


0
投票

仅仅因为需要进行所有查找,所以行走磁盘总是会慢于理想速度。如果这对您来说不是问题,我的建议是消除开销……从最小化fork()调用的数量开始。然后,您可以将结果缓存适当的时间。

由于您已经提到过PHP,所以我的建议是用PHP编写整个服务器端系统,并使用DirectoryIteratorRecursiveDirectoryIterator类。这是SO answer,类似于您要使用前者实现的内容。

如果磁盘I / O开销有问题,我的建议是按照mlocate的方式实现一个系统,该系统将目录列表和目录ctimes一起缓存,并使用stat()比较ctimes并仅重新读取目录其内容已更改。

我在PHP中没有做太多的文件系统工作,但是,如果有帮助,我可以为您提供基本的mlocate风格的updateb流程的Python实现。 (如果驱动器发生故障,因为它们太大而无法舒适地容纳在我的rdiff备份目标驱动器上,我将其用于索引必须从DVD + R手动还原的文件)


0
投票

9年后...使用tree应该可以完成这项工作。

tree ~ -J -L ? -P '?' -d --noreport

其中:

  • -J输出为json
  • -L最大水平深度(等于找到-maxdepth)
  • -P要包含的模式(等同于查找-name)
  • 仅-d目录(等于查找-type d)
© www.soinside.com 2019 - 2024. All rights reserved.