2024-04-11 21:51:53 +09:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2024-04-26 08:55:27 +09:00
|
|
|
require 'optparse'
|
2024-05-11 10:59:59 +09:00
|
|
|
require 'etc'
|
2024-04-26 08:55:27 +09:00
|
|
|
|
2024-04-15 22:48:09 +09:00
|
|
|
COLUMNS = 3
|
2024-05-21 09:41:20 +09:00
|
|
|
MARGIN = 3
|
2024-05-21 22:32:10 +09:00
|
|
|
PERMISSION = {
|
|
|
|
'0' => '---',
|
|
|
|
'1' => '--x',
|
|
|
|
'2' => '-w-',
|
|
|
|
'3' => '-wx',
|
|
|
|
'4' => 'r--',
|
|
|
|
'5' => 'r-x',
|
|
|
|
'6' => 'rw-',
|
|
|
|
'7' => 'rwx'
|
|
|
|
}.freeze
|
|
|
|
FILETYPE = {
|
|
|
|
'1' => 'p',
|
|
|
|
'2' => 'c',
|
|
|
|
'4' => 'd',
|
|
|
|
'6' => 'b',
|
|
|
|
'10' => '-',
|
|
|
|
'12' => 'l'
|
|
|
|
}.freeze
|
2024-04-11 21:51:53 +09:00
|
|
|
|
2024-04-24 22:37:28 +09:00
|
|
|
def run
|
2024-05-07 21:56:32 +09:00
|
|
|
listed_filenames = list_filenames
|
2024-04-24 22:37:28 +09:00
|
|
|
filenames_matrix = slice_filenames(listed_filenames)
|
|
|
|
filled_filenames = fill_filenames(filenames_matrix)
|
|
|
|
arrange_filenames(filled_filenames)
|
2024-04-11 21:51:53 +09:00
|
|
|
end
|
|
|
|
|
2024-05-07 21:56:32 +09:00
|
|
|
def list_filenames
|
|
|
|
params = ARGV.getopts('a', 'r', 'l')
|
2024-05-18 11:56:26 +09:00
|
|
|
filenames = params['a'] ? Dir.glob('*', File::FNM_DOTMATCH) : Dir.glob('*')
|
|
|
|
filenames = filenames.reverse if params['r']
|
2024-05-21 22:32:10 +09:00
|
|
|
if params['l']
|
|
|
|
ownerinfo(filenames)
|
|
|
|
exit
|
2024-05-05 21:40:28 +09:00
|
|
|
else
|
2024-05-07 21:56:32 +09:00
|
|
|
filenames
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-05-11 10:59:59 +09:00
|
|
|
def ownerinfo(filenames)
|
2024-05-16 09:15:11 +09:00
|
|
|
file_blocks(filenames)
|
2024-05-11 10:59:59 +09:00
|
|
|
filenames.each do |file|
|
|
|
|
file_stat = File::Stat.new(file)
|
|
|
|
file_type(file_stat)
|
|
|
|
permission(file_stat)
|
|
|
|
print " #{file_stat.nlink}"
|
|
|
|
print " #{Etc.getpwuid(file_stat.uid).name}"
|
|
|
|
print " #{Etc.getgrgid(file_stat.gid).name}"
|
|
|
|
print " #{file_stat.size}".rjust(file_size(filenames))
|
|
|
|
timestamp(file_stat)
|
|
|
|
symbolic(file)
|
|
|
|
puts
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-05-16 09:15:11 +09:00
|
|
|
def symbolic(filenames)
|
|
|
|
if File.lstat(filenames).symlink?
|
|
|
|
print " #{filenames} -> #{File.readlink(filenames)}"
|
2024-05-11 10:59:59 +09:00
|
|
|
else
|
2024-05-16 09:15:11 +09:00
|
|
|
print " #{filenames}"
|
2024-05-11 10:59:59 +09:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def permission(file_stat)
|
|
|
|
(-3..-1).each do |index|
|
2024-05-07 21:56:32 +09:00
|
|
|
case file_stat.mode.to_s(8)[index]
|
|
|
|
when '0' then print '---'
|
|
|
|
when '1' then print '--x'
|
|
|
|
when '2' then print '-w-'
|
|
|
|
when '3' then print '-wx'
|
|
|
|
when '4' then print 'r--'
|
|
|
|
when '5' then print 'r-x'
|
|
|
|
when '6' then print 'rw-'
|
|
|
|
when '7' then print 'rwx'
|
|
|
|
end
|
2024-05-05 21:40:28 +09:00
|
|
|
end
|
2024-04-11 21:51:53 +09:00
|
|
|
end
|
|
|
|
|
2024-05-11 10:59:59 +09:00
|
|
|
def file_type(file_stat)
|
2024-05-22 12:52:57 +09:00
|
|
|
{
|
|
|
|
'fifo' => 'p',
|
|
|
|
'characterSpecial' => 'c',
|
|
|
|
'directory' => 'd',
|
|
|
|
'blockSpecial' => 'b',
|
|
|
|
'file' => '-',
|
|
|
|
'link' => 'l',
|
|
|
|
'socket' => 's'
|
|
|
|
}[file_stat]
|
2024-05-11 10:59:59 +09:00
|
|
|
end
|
|
|
|
|
|
|
|
def file_size(filenames)
|
2024-05-21 09:41:20 +09:00
|
|
|
filenames.map { |file| File.size(file) }.max.to_s.length + MARGIN
|
2024-05-11 10:59:59 +09:00
|
|
|
end
|
|
|
|
|
|
|
|
def timestamp(file_stat)
|
2024-05-14 23:23:13 +09:00
|
|
|
print file_stat.mtime.strftime('%_m %_d %H:%M')
|
2024-05-11 10:59:59 +09:00
|
|
|
end
|
|
|
|
|
2024-05-16 09:15:11 +09:00
|
|
|
def file_blocks(filenames)
|
|
|
|
blocks = filenames.map do |file|
|
|
|
|
File::Stat.new(file).blocks
|
|
|
|
end
|
|
|
|
puts "total #{blocks.sum}"
|
|
|
|
end
|
|
|
|
|
2024-04-24 22:37:28 +09:00
|
|
|
def slice_filenames(listed_filenames)
|
|
|
|
columns_size = listed_filenames.size.ceildiv(COLUMNS)
|
|
|
|
listed_filenames.each_slice(columns_size).to_a
|
2024-04-11 21:51:53 +09:00
|
|
|
end
|
|
|
|
|
2024-04-24 22:37:28 +09:00
|
|
|
def fill_filenames(filenames_matrix)
|
|
|
|
array_size = filenames_matrix.map(&:size).max
|
|
|
|
filenames_matrix.each do |slice|
|
2024-04-15 22:48:09 +09:00
|
|
|
slice << '' while slice.size < array_size
|
2024-04-11 21:51:53 +09:00
|
|
|
end
|
2024-04-24 22:37:28 +09:00
|
|
|
filenames_matrix.transpose
|
2024-04-11 21:51:53 +09:00
|
|
|
end
|
|
|
|
|
2024-04-24 22:37:28 +09:00
|
|
|
def arrange_filenames(filled_filenames)
|
|
|
|
filenames_count = filled_filenames.flatten.map(&:size).max
|
|
|
|
filled_filenames.each do |arrange|
|
2024-04-15 22:48:09 +09:00
|
|
|
arrange.each do |arranged|
|
2024-04-24 22:37:28 +09:00
|
|
|
print arranged.ljust(filenames_count + 5)
|
2024-04-11 21:51:53 +09:00
|
|
|
end
|
|
|
|
puts
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-04-24 22:37:28 +09:00
|
|
|
run
|