繁体   English   中英

获取 UNIX 目录树结构到 JSON 对象中

[英]Get UNIX directory tree structure into JSON object

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

我已经尝试使用通过管道传输到 sed 的“ls”的许多变体,但似乎 find 效果最好。

现在我只是想使用命令

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

并标记路径变量

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

有没有更好或既定的方法来做到这一点?

谢谢!

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

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

通过抽象底层存储结构(文件系统),你创建了一个可以添加并发、处理 IO 错误等的层。 当有人更改结构内的文件时,Web 客户端是不可见的,直到“刮板”线程检测到更改并更新数据库。 但是,由于 Web 请求与读取底层文件结构无关,而只是查询数据库,因此响应时间应该很快。

HTH,你好。

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

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

在哪里:

  • -J 输出为 json
  • -L 最大级别深度(相当于找到 -maxdepth)
  • 要包含的 -P 模式(相当于查找 -name)
  • -d 仅目录(相当于查找 -type d)

遍历磁盘总是比理想的要慢,仅仅是因为需要完成所有的查找。 如果这对您来说不是问题,我的建议是努力消除开销……从最小化 fork() 调用的次数开始。 然后,您可以将结果缓存多久您觉得合适。

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

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

我在 PHP 中没有做太多文件系统工作,但是,如果有帮助,我可以为您提供基本 mlocate 风格的 updatedb 进程的 Python 实现。 (我用它来索引文件,如果我的驱动器出现故障,必须手动从 DVD+R 恢复,因为它们太大而无法舒适地安装在我的 rdiff-backup 目标驱动器上)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM