You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Rebol对比ls -1R输出文件,生成目标文件夹独有文件列表?

在Rebol中对比ls -1R输出文件的差异方案

核心思路

先把两个ls -1R生成的文本文件解析成目录-文件列表的字典结构,再对比两个字典找出新增文件,最后按原格式输出结果。用read/lines处理更直观,代码简洁易维护。

完整实现代码

; 解析ls -1R输出,返回目录为键、文件列表为值的字典
parse-ls-output: func [lines [block!]] [
    result: make hash! 0
    current-dir: none
    foreach line lines [
        line: trim line
        if empty? line [continue]
        ; 判断是否为目录行(以冒号结尾)
        if find line ":" [
            current-dir: trim/right line ":"
            result/:current-dir: make block! 0
        ] else [
            append result/:current-dir line
        ]
    ]
    return result
]

; 读取两个输入文件
folder1-lines: read/lines %list-folder1.txt
folder2-lines: read/lines %list-folder2.txt

; 解析为字典结构
folder1-data: parse-ls-output folder1-lines
folder2-data: parse-ls-output folder2-lines

; 生成差异内容
diff-content: make block! 0
foreach dir folder2-data [
    dir-name: dir/1
    folder2-files: dir/2
    ; 获取folder1中对应目录的文件列表,不存在则为空块
    folder1-files: get in folder1-data dir-name []
    
    ; 筛选folder2独有的文件
    new-files: difference folder2-files folder1-files
    if not empty? new-files [
        append diff-content rejoin [dir-name ":"]
        append diff-content new-files
        append diff-content ""  ; 空行分隔不同目录
    ]
]

; 写入结果文件,自动用换行连接内容
write %difference.txt join diff-content newline

代码说明

  1. 解析函数:遍历每行内容,识别目录行(以冒号结尾)并记录当前目录,后续行作为该目录下的文件加入对应列表。
  2. 读取方式:read/lines直接将文件内容按行拆分为块,处理结构化的ls -1R输出比read配合parse更简单,无需复杂的语法规则匹配。
  3. 差异计算:用difference函数直接对比两个文件列表,快速得到新增项;最后按原格式拼接目录和文件,写入结果文件。

效果验证

用你提供的示例文件测试,生成的difference.txt内容会完全符合预期:

examples:
file1.txt

examples/c:
file2.txt

examples/lua:
file3.txt

内容的提问来源于stack exchange,提问作者noein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:53:17