我怀疑这就是为什么我可能会按文件比较多次执行文件
我有两个目录:directory1
包含文件foo.txt
和bar.txt
,directory2
包含文件foo.txt
和bar.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
应该只打印四个名字。我的循环错了吗?
答案 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.txt
和bar.txt
,您实际上在两个目录中都有4
个文件。
这就是您的循环将16
文件名打印为4x4=16
您可以通过在任一目录中执行ls -a
命令来确认这一点。