113 lines
3.4 KiB
Plaintext
113 lines
3.4 KiB
Plaintext
--:Minify:--
|
|
local cloptions = {
|
|
a = false,
|
|
h = false,
|
|
l = false,
|
|
help = false,
|
|
}
|
|
local inpArgs = { ... }
|
|
local args = {}
|
|
local name = syscall.getTask(syscall.getpid()).name
|
|
|
|
for _, v in pairs(inpArgs) do
|
|
if v:sub(1, 2) == "--" then
|
|
local opt = v:sub(3)
|
|
if cloptions[opt] == nil then
|
|
print(name .. ": unrecognized option '" .. v .. "'.")
|
|
print("try '" .. name .. " --help' for more information.")
|
|
return
|
|
end
|
|
cloptions[opt] = true
|
|
elseif v:sub(1, 1) == "-" then
|
|
for i = 2, #v do
|
|
local opt = v:sub(i, i)
|
|
if cloptions[opt] == nil then
|
|
print(name .. ": invalid option '-" .. opt .. "'.")
|
|
print("try '" .. name .. " --help' for more information.")
|
|
return
|
|
end
|
|
cloptions[opt] = true
|
|
end
|
|
else
|
|
table.insert(args, v)
|
|
end
|
|
end
|
|
|
|
if cloptions.help then
|
|
print("Usage: " .. name .. " [OPTION]... [DIR]")
|
|
print("List all entries in the specified DIRectory, or cwd if not specified.")
|
|
print("Display directory tree structure.")
|
|
print("")
|
|
print("Options:")
|
|
print(" -a do not ignore entries starting with .")
|
|
print(" -h with -l, print sizes in human readable format (e.g., 1K 234M 2G)")
|
|
print(" -l use a long listing format (show file sizes)")
|
|
print(" --help display this help and exit")
|
|
return
|
|
end
|
|
|
|
local fs = require("fs")
|
|
local dir = args[1] or ""
|
|
if dir:sub(1, 1) ~= "/" then
|
|
dir = syscall.getcwd() .. "/" .. dir
|
|
end
|
|
if dir:sub(-1) ~= "/" then dir = dir .. "/" end
|
|
|
|
if not fs.isDir(dir) then
|
|
print(name .. ": cannot access '" .. (args[1] or dir) .. "': no such directory")
|
|
return
|
|
end
|
|
|
|
local function format_size(size)
|
|
if not cloptions.h then return tostring(size) end
|
|
if size < 1024 then return tostring(size) .. "B"
|
|
elseif size < 1024*1024 then return string.format("%.1fK", size/1024)
|
|
elseif size < 1024*1024*1024 then return string.format("%.1fM", size/1024/1024)
|
|
else return string.format("%.1fG", size/1024/1024/1024) end
|
|
end
|
|
|
|
local function pdir(current_dir, level, prefix)
|
|
prefix = prefix or ""
|
|
local list = fs.list(current_dir)
|
|
if not cloptions.a then
|
|
for i = #list, 1, -1 do
|
|
if list[i]:sub(1, 1) == "." then table.remove(list, i) end
|
|
end
|
|
end
|
|
table.sort(list)
|
|
if current_dir:sub(-1) ~= "/" then current_dir = current_dir .. "/" end
|
|
|
|
for i, entry in ipairs(list) do
|
|
local full_path = current_dir .. entry
|
|
local is_last = (i == #list)
|
|
local branch = is_last and "`--" or "|--"
|
|
local indent = prefix .. branch
|
|
local suffix = ""
|
|
local info = ""
|
|
|
|
if fs.isDir(full_path) then
|
|
suffix = "/"
|
|
end
|
|
|
|
if cloptions.l then
|
|
local stat = fs.stat and fs.stat(full_path)
|
|
if stat then
|
|
local size = stat.size or 0
|
|
info = " " .. format_size(size)
|
|
end
|
|
end
|
|
|
|
print(indent .. entry .. suffix .. info)
|
|
|
|
if fs.isDir(full_path) then
|
|
local new_prefix = prefix .. (is_last and " " or "| ")
|
|
pcall(pdir, full_path, level + 1, new_prefix)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Print root directory
|
|
local root_name = dir:sub(1, -2) -- remove trailing /
|
|
if root_name == "" then root_name = "/" end
|
|
print(root_name)
|
|
pdir(dir, 0, "") |