3

我最近开始使用 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 命令来获取列表。

4

2 回答 2

1

最明显的方法是使用pathnamefind from std-lib 来处理这个问题。使用该each_child方法或类似的方法,以及任何过滤,您可以做到这一点,而根本不需要使用外部命令。

您也可以在不触及标准库、使用FileDir对象的情况下执行相同操作。

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

于 2012-09-05T02:07:06.323 回答
0

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

于 2013-12-18T18:11:18.440 回答