RosettaCodeData/Task/Walk-a-directory-Recursively/Lua/walk-a-directory-recursively-1.lua
2023-07-01 13:44:08 -04:00

38 lines
948 B
Lua

local lfs = require("lfs")
-- This function takes two arguments:
-- - the directory to walk recursively;
-- - an optional function that takes a file name as argument, and returns a boolean.
function find(self, fn)
return coroutine.wrap(function()
for f in lfs.dir(self) do
if f ~= "." and f ~= ".." then
local _f = self .. "/" .. f
if not fn or fn(_f) then
coroutine.yield(_f)
end
if lfs.attributes(_f, "mode") == "directory" then
for n in find(_f, fn) do
coroutine.yield(n)
end
end
end
end
end)
end
-- Examples
-- List all files and directories
for f in find("directory") do
print(f)
end
-- List lua files
for f in find("directory", function(self) return self:match("%.lua$") end) do
print(f)
end
-- List directories
for f in find("directory", function(self) return "directory" == lfs.attributes(self, "mode") end) do
print(f)
end