使用Ruby

时间:2016-09-12 14:51:40

标签: ruby

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

2 个答案:

答案 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