将“ls -l”输出转换为类似于File的对象

时间:2012-09-05 02:03:02

标签: ruby

我最近开始使用Ruby,并想知道是否有办法将列表输出转换为对象,以便我可以访问属性。

要更清楚一点,这是我的输出

find ./* -type f | xargs ls -l
-rw-r--r--  1 ncktrnl  staff  0 Sep  4 18:52 ./dir1/file3
-rw-r--r--  1 ncktrnl  staff  0 Sep  4 18:52 ./file1
-rw-r--r--  1 ncktrnl  staff  0 Sep  4 18:52 ./file2

现在我想将上面的列表转换为File或Dir对象,以便我可以轻松访问属性。

例如:

output = `find ./* -type f | xargs ls -l`
out_arr = output.split("\n")
out_arr.each do |line|
  f = File.new(line)
  puts "#{f.mtime}" # => prints mtime after parsing the line
end

我使用File.new作为示例,但我不认为这是如何工作的,所以我想知道是否有办法做到这一点。我可以编写自己的解析器但不确定是否存在已存在的东西。我无法创建实际文件的文件对象,因为我通过在其他主机上运行远程ssh命令来获取列表。

2 个答案:

答案 0 :(得分:0)

最明显的方法是使用std-lib中的pathnamefind来处理这个问题。使用each_child方法或类似的方法,以及任何过滤,您可以执行此操作,而无需根据外部命令执行此操作。

您也可以使用FileDir对象在不触及std-lib的情况下执行相同操作。

虽然您可以手动提取路径(仅限)并创建文件实例,但您无法创建具有所需详细信息的File对象。但实际上,完全避免使用外壳命令是最好的选择。

答案 1 :(得分:0)

net-ftp-list gem,它可以解析来自不同远程系统的ls输出。