Ruby can create a directory and list entries in a deterministic order.

directory listing Sorting directory entries makes output stable and easier to compare.

Directory Listing

extra_file
directory_listing.rb
Replay: real traced execution (multi-file project)
require "tmpdir"

extra_file = "todo.txt"

Dir.mktmpdir do |dir|
  project_dir = File.join(dir, "project")
  Dir.mkdir(project_dir)

  File.write(File.join(project_dir, "readme.txt"), "readme\n")
  File.write(File.join(project_dir, extra_file), "item\n")

  entries = Dir.children(project_dir).sort

  puts "directory=#{File.basename(project_dir)}"
  puts "entries=#{entries.join(",")}"
  puts "count=#{entries.length}"
end
require "tmpdir"

extra_file = "done.txt"

Dir.mktmpdir do |dir|
  project_dir = File.join(dir, "project")
  Dir.mkdir(project_dir)

  File.write(File.join(project_dir, "readme.txt"), "readme\n")
  File.write(File.join(project_dir, extra_file), "item\n")

  entries = Dir.children(project_dir).sort

  puts "directory=#{File.basename(project_dir)}"
  puts "entries=#{entries.join(",")}"
  puts "count=#{entries.length}"
end
require "tmpdir"

extra_file = "notes.md"

Dir.mktmpdir do |dir|
  project_dir = File.join(dir, "project")
  Dir.mkdir(project_dir)

  File.write(File.join(project_dir, "readme.txt"), "readme\n")
  File.write(File.join(project_dir, extra_file), "item\n")

  entries = Dir.children(project_dir).sort

  puts "directory=#{File.basename(project_dir)}"
  puts "entries=#{entries.join(",")}"
  puts "count=#{entries.length}"
end
  1. extra_file ← todo.txt

    1require "tmpdir"23extra_file→ todo.txt = "todo.txt"  #@extra_file="done.txt", "notes.md"45Dir.mktmpdir do |dir|6  project_dir = File.join(dir, "project")7  Dir.mkdir(project_dir)89  File.write(File.join(project_dir, "readme.txt"), "readme\n")10  File.write(File.join(project_dir, extra_file), "item\n")1112  entries = Dir.children(project_dir).sort1314  puts "directory=#{File.basename(project_dir)}"15  puts "entries=#{entries.join(",")}"16  puts "count=#{entries.length}"17end
  2. project_dir ← /tmp/⟨tmp A⟩/project, entries ← ["readme.txt", "todo.txt"]

    5Dir.mktmpdir do |dir/tmp/⟨tmp A⟩|6  project_dir→ /tmp/⟨tmp A⟩/project = File.join(dir, "project")/tmp/⟨tmp A⟩/project7  Dir.mkdir(project_dir/tmp/⟨tmp A⟩/project)89  File.write(File.join(project_dir, "readme.txt")/tmp/⟨tmp A⟩/project/readme.txt, "readme\n")10  File.write(File.join(project_dir, extra_file)/tmp/⟨tmp A⟩/project/todo.txt, "item\n")1112  entries→ ["readme.txt", "todo.txt"] = Dir.children(project_dir).sort["readme.txt", "todo.txt"]1314  puts "directory=#{File.basename(project_dir)project}"15  puts "entries=#{entries.join(",")readme.txt,todo.txt}"16  puts "count=#{entries.length2}"17end
    outputdirectory=project
    entries=readme.txt,todo.txt
    count=2
  1. extra_file ← done.txt

    1require "tmpdir"23extra_file→ done.txt = "done.txt"45Dir.mktmpdir do |dir|6  project_dir = File.join(dir, "project")7  Dir.mkdir(project_dir)89  File.write(File.join(project_dir, "readme.txt"), "readme\n")10  File.write(File.join(project_dir, extra_file), "item\n")1112  entries = Dir.children(project_dir).sort1314  puts "directory=#{File.basename(project_dir)}"15  puts "entries=#{entries.join(",")}"16  puts "count=#{entries.length}"17end
  2. project_dir ← /tmp/⟨tmp A⟩/project, entries ← ["done.txt", "readme.txt"]

    5Dir.mktmpdir do |dir/tmp/⟨tmp A⟩|6  project_dir→ /tmp/⟨tmp A⟩/project = File.join(dir, "project")/tmp/⟨tmp A⟩/project7  Dir.mkdir(project_dir/tmp/⟨tmp A⟩/project)89  File.write(File.join(project_dir, "readme.txt")/tmp/⟨tmp A⟩/project/readme.txt, "readme\n")10  File.write(File.join(project_dir, extra_file)/tmp/⟨tmp A⟩/project/done.txt, "item\n")1112  entries→ ["done.txt", "readme.txt"] = Dir.children(project_dir).sort["done.txt", "readme.txt"]1314  puts "directory=#{File.basename(project_dir)project}"15  puts "entries=#{entries.join(",")done.txt,readme.txt}"16  puts "count=#{entries.length2}"17end
    outputdirectory=project
    entries=done.txt,readme.txt
    count=2
  1. extra_file ← notes.md

    1require "tmpdir"23extra_file→ notes.md = "notes.md"45Dir.mktmpdir do |dir|6  project_dir = File.join(dir, "project")7  Dir.mkdir(project_dir)89  File.write(File.join(project_dir, "readme.txt"), "readme\n")10  File.write(File.join(project_dir, extra_file), "item\n")1112  entries = Dir.children(project_dir).sort1314  puts "directory=#{File.basename(project_dir)}"15  puts "entries=#{entries.join(",")}"16  puts "count=#{entries.length}"17end
  2. project_dir ← /tmp/⟨tmp A⟩/project, entries ← ["notes.md", "readme.txt"]

    5Dir.mktmpdir do |dir/tmp/⟨tmp A⟩|6  project_dir→ /tmp/⟨tmp A⟩/project = File.join(dir, "project")/tmp/⟨tmp A⟩/project7  Dir.mkdir(project_dir/tmp/⟨tmp A⟩/project)89  File.write(File.join(project_dir, "readme.txt")/tmp/⟨tmp A⟩/project/readme.txt, "readme\n")10  File.write(File.join(project_dir, extra_file)/tmp/⟨tmp A⟩/project/notes.md, "item\n")1112  entries→ ["notes.md", "readme.txt"] = Dir.children(project_dir).sort["notes.md", "readme.txt"]1314  puts "directory=#{File.basename(project_dir)project}"15  puts "entries=#{entries.join(",")notes.md,readme.txt}"16  puts "count=#{entries.length2}"17end
    outputdirectory=project
    entries=notes.md,readme.txt
    count=2