如何让Ruby的Find.find跟随符号链接?
问题的原因是希望在使用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")
这种方法不能保留符号链接的原始路径,但暂时对我来说是可行的。
问题的原因是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月提出的)。
在这段对话中,问题的出现是由于用户想要使用Ruby的Find.find方法来递归查找文件,但是该方法不会遵循符号链接。用户询问是否有方法可以使Find.find方法遵循符号链接。有几种解决方法被提到:
1. 使用Dir代替Find.find,因为Dir会遵循符号链接。
2. 尝试使用alib库来解决这个问题。
3. 使用双星号通配符来递归查找文件,例如Dir["**/*"]。
4. 使用Pathname#children方法来代替Dir["*/"],因为Dir["*/"]只能用于一层层次结构,而Pathname#children方法可以处理多层次结构和符号链接。
这些解决方法都提供了不同的途径来解决原始问题。用户对alib库提出了一些疑问,包括它是否在生产代码中可用以及用户的使用经验如何。