|
Packit |
437b5e |
-- tree view of the file system like the "tree" unix utility
|
|
Packit |
437b5e |
-- John Belmonte <jvb@prairienet.org>
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local posix = require 'posix'
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local leaf_indent = '| '
|
|
Packit |
437b5e |
local tail_leaf_indent = ' '
|
|
Packit |
437b5e |
local leaf_prefix = '|-- '
|
|
Packit |
437b5e |
local tail_leaf_prefix = '`-- '
|
|
Packit |
437b5e |
local link_prefix = ' -> '
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function printf(...)
|
|
Packit |
437b5e |
io.write(string.format(...))
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function do_directory(directory, level, prefix)
|
|
Packit |
437b5e |
local num_dirs = 0
|
|
Packit |
437b5e |
local num_files = 0
|
|
Packit |
437b5e |
local files = posix.dir(directory)
|
|
Packit |
437b5e |
local last_file_index = #files
|
|
Packit |
437b5e |
table.sort(files)
|
|
Packit |
437b5e |
for i, name in ipairs(files) do
|
|
Packit |
437b5e |
if name ~= '.' and name ~= '..' then
|
|
Packit |
437b5e |
local full_name = string.format('%s/%s', directory, name)
|
|
Packit |
437b5e |
local info = assert(posix.stat(full_name))
|
|
Packit |
437b5e |
local is_tail = (i==last_file_index)
|
|
Packit |
437b5e |
local prefix2 = is_tail and tail_leaf_prefix or leaf_prefix
|
|
Packit |
437b5e |
local link = ''
|
|
Packit |
437b5e |
if info.type == 'link' then
|
|
Packit |
437b5e |
linked_name = assert(posix.readlink(full_name))
|
|
Packit |
437b5e |
link = string.format('%s%s', link_prefix, linked_name)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
printf('%s%s%s%s\n', prefix, prefix2, name, link)
|
|
Packit |
437b5e |
if info.type == 'directory' then
|
|
Packit |
437b5e |
local indent = is_tail and tail_leaf_indent or leaf_indent
|
|
Packit |
437b5e |
-- TODO: cache string concatination
|
|
Packit |
437b5e |
sub_dirs, sub_files = do_directory(full_name, level+1,
|
|
Packit |
437b5e |
prefix .. indent)
|
|
Packit |
437b5e |
num_dirs = num_dirs + sub_dirs + 1
|
|
Packit |
437b5e |
num_files = num_files + sub_files
|
|
Packit |
437b5e |
else
|
|
Packit |
437b5e |
num_files = num_files + 1
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
return num_dirs, num_files
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local function fore(directory)
|
|
Packit |
437b5e |
print(directory)
|
|
Packit |
437b5e |
num_dirs, num_files = do_directory(directory, 0, '')
|
|
Packit |
437b5e |
printf('\n%d directories, %d files\n', num_dirs, num_files)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
directory = (arg and #arg > 0) and arg[1] or '.'
|
|
Packit |
437b5e |
fore(directory)
|