ruby:使用链接解除引用递归复制目录

时间:2014-08-02 19:54:17

标签: ruby

非常奇怪,我无法找到任何标准方式,以便在解除引用符号链接时以递归方式复制目录。我能找到的最好的是FindUtils.cp_r,但它只支持取消引用root src目录。

copy_entry是相同的,尽管文档错误地显示它有一个选项dereference。在源代码中它是dereference_root,它只是那样。

此外,我无法找到标准方式来递归目录。如果没有什么好处,我可以自己写一些东西,但想要一些简单的东西,经过测试,可以在Windows和Unix上移植。

2 个答案:

答案 0 :(得分:1)

递归到目录的标准方法是使用Find类,但我认为你将不得不写一些东西。内置的FileUtils方法是正常操作的构建块,但您的需求并不正常。

我建议查看Ruby附带的Pathname类。使用find可以轻松地遍历目录,查看文件的类型并在必要时取消引用它。特别是symlink?将告诉您文件是否是软链接,realpath将解析链接并返回真实文件的路径。

例如,我的主目录中有.vimvim的软链接:

vim = Pathname.new ENV['HOME'] + '/.vim'
=> #<Pathname:/Users/ttm/.vim>
vim.realpath
=> #<Pathname:/Users/ttm/vim>

路径名非常强大,我发现在进行一些主要的目录遍历和使用软链接时非常好。文档说:

  

这个类的目标是以比标准Ruby提供的更简洁的方式操作文件路径信息。 [...]

     

包括File,FileTest以及Dir和FileUtils中的一些功能,这是一种不足为奇的方式。它本质上是所有这些的外观,甚至更多。

如果您使用find,您可能希望实现prune方法,该方法用于跳过您不想进入的条目。当我编写代码时,我在Pathname中找不到它,所以我使用类似的东西添加它:

class Pathname
  def prune
    Find.prune
  end
end

答案 1 :(得分:0)

这是我在ruby中的find -follow的实现:

https://gist.github.com/akostadinov/05c2a976dc16ffee9cac

我可以将它分离成一个类或猴子补丁但我决定将其作为一个独立的方法。可能存在改进的空间,因为它不适用于jruby。如果有人有想法,欢迎

更新:找出为什么不使用jruby - https://github.com/jruby/jruby/issues/1895 我会尝试解决。我实施了一种解决方法。

更新2:现在cp_r_dereference方法就绪 - https://gist.github.com/akostadinov/fc688feba7669a4eb784