如何用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
代码说明
- 解析函数:遍历每行内容,识别目录行(以冒号结尾)并记录当前目录,后续行作为该目录下的文件加入对应列表。
- 读取方式:
read/lines直接将文件内容按行拆分为块,处理结构化的ls -1R输出比read配合parse更简单,无需复杂的语法规则匹配。 - 差异计算:用
difference函数直接对比两个文件列表,快速得到新增项;最后按原格式拼接目录和文件,写入结果文件。
效果验证
用你提供的示例文件测试,生成的difference.txt内容会完全符合预期:
examples: file1.txt examples/c: file2.txt examples/lua: file3.txt
内容的提问来源于stack exchange,提问作者noein
相关产品推荐
相关产品推荐

