如何使Ruby的Find.Find跟随符号链接?

如何使Ruby的Find.Find跟随符号链接?,ruby,find,symlink,Ruby,Find,Symlink,我有一个文件层次结构,一些子目录是相对的符号链接。我使用爬网通过这些目录,找到一些特定的文件。然而,它并没有查看任何符号链接的目录,它遵循的是符号链接的文件 看一下,问题似乎是因为它使用的是File.lstatfile.directory?测试某物是否为目录。对于符号链接,返回false,但对于File.stat.directory?返回true 我怎样才能使Find.Find follow符号链接,而不用monkey将其修补为使用File.stat而不是File.lstat?为什么不使用Dir

我有一个文件层次结构,一些子目录是相对的符号链接。我使用爬网通过这些目录,找到一些特定的文件。然而,它并没有查看任何符号链接的目录,它遵循的是符号链接的文件

看一下,问题似乎是因为它使用的是File.lstatfile.directory?测试某物是否为目录。对于符号链接,返回false,但对于File.stat.directory?返回true

我怎样才能使Find.Find follow符号链接,而不用monkey将其修补为使用File.stat而不是File.lstat?

为什么不使用Dir?它遵循符号链接 或者你可以试试


要使目录递归查找文件,请尝试使用Daniel J.Berger的文件查找库double asterix Dir[***]

。它是一颗红宝石。然后,您可以通过以下方式递归查找:

require 'rubygems'
require 'file/find'
File::Find.new(:follow => false).find { |p| puts p }
注意:与文档和直觉相反,设置:follow=>false实际上会使File::Find follow all符号链接,至少在我的机器上是Ubuntu 10.04、Ruby 1.8.7、File Find 0.3.4


对于File::Find,还有许多其他选项可用,如名称模式、文件类型、atime、ctime、mtime等。请查看RDoc。

对于其他观看的人,我最终使用了和以下递归代码:

def all_files_under(*paths)
  paths.flatten!
  paths.map! { |p| Pathname.new(p) }
  files = paths.select { |p| p.file? }
  (paths - files).each do |dir|
    files << all_files_under(dir.children)
  end
  files.flatten
end

我遇到了类似的情况,并决定遵循真正的道路没有额外的宝石

require 'find'

paths = ARGV

search_dirs = paths.dup
found_files = Array.new

until search_dirs.size == 0
  Find.find( search_dirs.shift ) do |path|
    if File.directory?( path ) && File.symlink?( path )
      search_dirs << File.realdirpath( path )
    else
      found_files << path
    end
  end
end

puts found_files.join("\n")

这种方法无法使用符号链接保留原始路径,但目前对我来说还可以。

编写了另一个带有循环检查和有限递归的选项。也可以与jruby一起使用


这里有一个要点:

这里是递归路径名方法的一个更简单、更有效的版本:

def find_files(*paths)
  paths.flatten.map do |path|
    path = Pathname.new(path)
    path.file? ? [path.to_s] : find_files(path.children)
  end.flatten
end 

如何使Dir递归查找文件?我在Dir类中没有看到一个方法-我在这里遗漏了什么吗?虽然alib似乎有类似的代码,但我从来没有听说过它-它不在github/gemcutter上,它的名字本身就是一个lib,这并不能激发很多信心。您在生产代码中使用过它吗?体验如何?Dir[*/]似乎只适用于一个层次结构级别-我有多个层次,其中一些作为符号链接。我最终使用了Pathnamechildren谢谢。最后,我使用带有递归函数的路径名来完成此操作。下次当我在代码库中时,我会尝试一下,我的问题是从2010年10月开始的。