使用 JQ 构建目录树的 JSON

Posted

技术标签:

【中文标题】使用 JQ 构建目录树的 JSON【英文标题】:Building a JSON of a directory tree using JQ 【发布时间】:2018-09-26 18:03:28 【问题描述】:

我正在尝试使用jq 构建目录树的 JSON。我已经完成了一半,但是目录树是扁平的,我需要将每个目录放入它的父级 children 数组中。

我目前的代码是dirtree.jq:

[
    split("\n\n") as $list

    | $list
    | .[0]
    | split("\n")
    | .  + [  .[0] | split("\\") | .[0:-1] | join("\\")  ] # add root folder
    | sort
    | . as $folders

    | $list
    | .[1]
    | split("\n") as $files

    | $folders [] as $parent


    | 
        path: $parent,
        children: (
            $files
            | map(
                path: select(
                    . | (split("\\") | .[0:-1] | join("\\")) as $fileParent # get parent path
                      | $fileParent == $parent
                )
            )
        )
    



] as $flatTree
| $flatTree

input 文件是格式列表中的原始纯文本文件:

首先是给定文件夹的所有目录

然后空行

然后列出所有文件


C:\Program Files\7-Zip
C:\Program Files\ASUS
C:\Program Files\Common Files
C:\Program Files\Intel
C:\Program Files\Internet Explorer
C:\Program Files\Mozilla Firefox
C:\Program Files\MSBuild
C:\Program Files\NVIDIA Corporation
C:\Program Files\Realtek
.
.
.
C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\en-US
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\en
                <-- NOTE THIS EMPTY LINE (\n\n) that separates folders from files
C:\Program Files\desktop.ini
C:\Program Files\7-Zip\7-zip.chm
C:\Program Files\7-Zip\7-zip.dll
C:\Program Files\7-Zip\7-zip32.dll
C:\Program Files\7-Zip\7z.dll
C:\Program Files\7-Zip\7z.exe
C:\Program Files\7-Zip\7z.sfx
C:\Program Files\7-Zip\7zCon.sfx
C:\Program Files\7-Zip\7zFM.exe
C:\Program Files\7-Zip\7zG.exe
C:\Program Files\7-Zip\descript.ion
.
.
.
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\Microsoft.PowerShell.PSReadline.dll
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\PSReadline.psd1
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\PSReadline.psm1
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\en\Microsoft.PowerShell.PSReadline.Resources.dll

resulting json 已将所有文件添加到各自的父级,但现在我需要将每个文件夹移动到 parentchildren 数组中


命令行:

jq -R --slurp -s -f dirtree.jq input.txt &gt; dirtree.json

【问题讨论】:

【参考方案1】:

以下内容可能不是您想要的,但应该可以帮助您:

def parsePathname: split("\\") | path: .[0:length-1], file: .[-1];

# skip over lines that only specify directories
def pathnames:
  foreach inputs as $x (null;
    if . == null
    then if ($x|length) == 0 then 0 else . end
    else .+1
    end;
    select(. and . > 0)|$x)
    | parsePathname ;

reduce pathnames as $pn (;
  getpath($pn.path + ["children"]) as $children
  | setpath($pn.path + ["children"]; $children + [$pn.file]) )

输出

在您的列表修剪指示性行后,运行以下命令:

jq -R -n -f dirtree.jq dirtree.txt

产生:


  "C:": 
    "Program Files": 
      "children": [
        "desktop.ini"
      ],
      "7-Zip": 
        "children": [
          "7-zip.chm",
          "7-zip.dll",
          "7-zip32.dll",
          "7z.dll",
          "7z.exe",
          "7z.sfx",
          "7zCon.sfx",
          "7zFM.exe",
          "7zG.exe",
          "descript.ion"
        ]
      ,
      "WindowsPowerShell": 
        "Modules": 
          "PSReadline": 
            "1.2": 
              "children": [
                "Microsoft.PowerShell.PSReadline.dll",
                "PSReadline.psd1",
                "PSReadline.psm1"
              ],
              "en": 
                "children": [
                  "Microsoft.PowerShell.PSReadline.Resources.dll"
                ]
              
            
          
        
      
    
  

【讨论】:

以上是关于使用 JQ 构建目录树的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP 中的平面路径数组构建目录树

决策树(Decision Tree)决策树的构建决策树流程树的生长熵信息增益比基尼系数

使用 Python 构建树的线性层次结构

从 json 文件构造 boost 属性树的性能很差?

Vue组件之无限级目录树构建

R语言使用party包中的ctree函数构建条件推理决策树的流程和步骤条件推理决策树是传统决策树的一个重要变体条件推理树的分裂是基于显著性测试而不是熵/纯度/同质性度量来选择分裂