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

15 浏览
0 Comments

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

我有一个文件层次结构,其中一些子目录是相对符号链接。我使用Ruby的Find.find来遍历这些目录并找到一些特定的文件。然而,它不会查找任何目录,它只会跟随符号链接的文件。

查看源代码,似乎问题是因为它使用File.lstat(file).directory?来测试是否为目录。这对于符号链接返回false,但File.stat.directory?返回true。

除了对其进行monkey patch以使用File.stat而不是File.lstat之外,我如何使Find.find跟随符号链接?

0
0 Comments

问题的原因是希望在使用Ruby的Find.find方法时能够跟随符号链接。但是默认情况下,Find.find方法不会跟随符号链接,而是返回符号链接本身。

为了解决这个问题,可以使用File.symlink?方法来判断是否为符号链接,如果是,则使用File.realdirpath方法获取符号链接所指向的真实路径。

以下是解决方法的具体代码:

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")

这种方法不能保留符号链接的原始路径,但暂时对我来说是可行的。

0
0 Comments

问题的原因是Ruby的Find.find方法默认不会跟随符号链接,即使在文档中和直觉中都设置了:follow => false。解决方法是使用Daniel J. Berger的file-find库,该库可作为Ruby的gem使用。然后可以使用以下代码进行递归查找:

require 'rubygems'
require 'file/find'
File::Find.new(:follow => false).find { |p| puts p }

需要注意的是,与文档和直觉相反,设置:follow => false 实际上会使File::Find跟随所有符号链接,至少在我的机器上(Ubuntu 10.04,Ruby 1.8.7,file-find 0.3.4)是如此。

File::Find还有许多其他选项可用,例如文件名模式、文件类型、atime、ctime、mtime等。可以查看RDoc获取更多信息。

感谢回答。我最终使用了Pathname和递归函数来实现这个功能。下次我进入那个代码库时我会试试这个方法(我的问题是在2010年10月提出的)。

0
0 Comments

在这段对话中,问题的出现是由于用户想要使用Ruby的Find.find方法来递归查找文件,但是该方法不会遵循符号链接。用户询问是否有方法可以使Find.find方法遵循符号链接。有几种解决方法被提到:

1. 使用Dir代替Find.find,因为Dir会遵循符号链接。

2. 尝试使用alib库来解决这个问题。

3. 使用双星号通配符来递归查找文件,例如Dir["**/*"]。

4. 使用Pathname#children方法来代替Dir["*/"],因为Dir["*/"]只能用于一层层次结构,而Pathname#children方法可以处理多层次结构和符号链接。

这些解决方法都提供了不同的途径来解决原始问题。用户对alib库提出了一些疑问,包括它是否在生产代码中可用以及用户的使用经验如何。

0