Ruby的新手,我已经坚持这个问题好几天了。我有一个目录数组,其中我只想获得它下面所有文件/目录的3-4位数文件权限位(0744)。
问题似乎是File :: Stat类抛出将文件转换为整数的错误。
对此问题的任何见解或文档都会有很大帮助。这是分解和转换文件的初始代码:
%w(/etc /bin /usr/lbin /sbin).each do |dir|
Dir.glob("#{dir}/**/*").each do |c|
m = File.stat("#{c}").world_readable?
sprintf("%o", m)
end
end
这是我的错误:
jtest.rb:4:in `sprintf': can't convert File::Stat into Integer (TypeError)
from jtest.rb:4
from jtest.rb:2:in `each'
from jtest.rb:2
from jtest.rb:1:in `each'
from jtest.rb:1
答案 0 :(得分:0)
这不能满足你的需求吗?
File.stat("#{c}").mode.to_s(8)
请注意.mode以整数形式提供文件权限,我认为您只是因为整数表示基数为10而感到困惑,而您在控制台中看到的权限则显示为基数8。 / p>
这应该接近你想要的:
%w(/etc /bin /usr/bin /usr/lbin /usr/usb /sbin /usr/sbin).each do |dir|
Dir.glob("#{dir}/**/*", File::FNM_DOTMATCH).each do |c| # include hidden files
unless File.symlink?(c)
puts c + " - " + File.stat(c).mode.to_s(8)
end
end
end
答案 1 :(得分:0)
%w(/etc /bin /usr/bin /usr/lbin /usr/usb /sbin /usr/sbin).each do |dir|
Dir.glob("#{dir}/**/*", File::FNM_DOTMATCH).each do |file|
begin
m = File.stat(file).mode
puts "File #{file} has a permission #{File.stat(file).mode.to_s(8)}" \
if (m%512 - m%64) / 64 < m%8
rescue => e
puts "[ERR] Unable to handle #{file}. Message: #{e.message}"
end
end
end