如何迭代两个目录

时间:2016-03-14 17:08:04

标签: ruby

我怀疑这就是为什么我可能会按文件比较多次执行文件

我有两个目录:directory1包含文件foo.txtbar.txtdirectory2包含文件foo.txtbar.txt。< / p>

def process(directory1, directory2)
  Dir.foreach(directory1) do |file1|
    Dir.foreach(directory2) do |file2|
      puts file1 + file2
    end
  end
end

当我跑步时,我得到:

..
...
.foo.txt
.bar.txt
...
....
..foo.txt
..bar.txt
foo.txt.
foo.txt..
foo.txtfoo.txt
foo.txtbar.txt
bar.txt.
bar.txt..
bar.txtfoo.txt
bar.txtbar.txt

应该只打印四个名字。我的循环错了吗?

3 个答案:

答案 0 :(得分:2)

稍微缩进会使问题更加清晰:

def process(directory1, directory2)
  Dir.foreach(directory1) do |file1|
    Dir.foreach(directory2) do |file2|
      puts file1 + file2
    end
  end
end

对于directory1中的每件商品,您都会在directory2中打印每件商品。

我不完全确定您是如何尝试使用这些文件的,或者为什么要在示例中将名称添加到一起,但将这些文件分成两个单独的循环就足以命中每个文件一次。

这里可能令人惊讶的另一部分是“。”循环遍历这些目录时,“..”显示为文件。那是因为 ”。”是一个代表当前目录的占位符文件,“..”表示父目录,就像使用命令行时一样,但是当您以这种方式枚举目录时,Ruby也包含它们。

答案 1 :(得分:2)

要回答标题中的实际问题,您可以使用Dir::[]对2个目录进行迭代,例如:

Dir['/directory1/*','/directory2/*'] 

这将返回位于Array/directory1正下方的/directory2个文件和目录。 这也会忽略点文件。

请参阅Dir#glob了解其他模式选项,例如递归(**)。

答案 2 :(得分:1)

在Linux中,目录中还有...个文件。

通过foo.txtbar.txt,您实际上在两个目录中都有4个文件。

这就是您的循环将16文件名打印为4x4=16

的原因

您可以通过在任一目录中执行ls -a命令来确认这一点。