如何使Ruby的Find.Find跟随符号链接?
我有一个文件层次结构,一些子目录是相对的符号链接。我使用爬网通过这些目录,找到一些特定的文件。然而,它并没有查看任何符号链接的目录,它遵循的是符号链接的文件 看一下,问题似乎是因为它使用的是File.lstatfile.directory?测试某物是否为目录。对于符号链接,返回false,但对于File.stat.directory?返回true 我怎样才能使Find.Find follow符号链接,而不用monkey将其修补为使用File.stat而不是File.lstat?为什么不使用Dir?它遵循符号链接 或者你可以试试如何使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
要使目录递归查找文件,请尝试使用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月开始的。