在指定的文件夹/子文件夹中按模式搜索文件

时间:2016-02-25 21:01:51

标签: ruby

我正在尝试设置文件夹并定义子文件夹搜索的深度,以查找指定模式下文件夹和子文件夹中的所有文件。

类似的东西:

b = 0 
while b < searchdeep # here number of subfolders inside
  $finale = '*'+'/*'*b
  fileshow = Dir.glob($finale).select {|f| File.file?  f} and (some magic with pattern)
  puts fileshow
 b += 1
end

1 个答案:

答案 0 :(得分:0)

假设您要查找所有 .zip 文件(在数组中返回)。

如果要搜索任何给定的文件夹(带递归)

require 'find'

arr = []
Find.find('/home') do |p|
  arr << p if p =~ /.zip$/
end

arr

以特定深度搜索

b = 2
path = "/home#{'/*' * b}/*.zip"
Dir.glob(path)

修改

我有以下4个级别的树,其中两个文件分布在随机文件夹中( stackov-file file-stackov

[root@ip-10-0-0-118 main_folder]# tree
.
├── level_1_a
│   ├── file-stackov
│   ├── level_2_a
│   │   └── level_3_a
│   │       ├── file-stackov
│   │       ├── level_4_a
│   │       │   ├── file-stackov
│   │       │   └── stackov-file
│   │       └── stackov-file
│   └── stackov-file
└── level_1_b
    ├── level_2_b
    │   └── level_3_b
    │       └── level_4_b
    │           └── stackov-file
    └── stackov-file

8 directories, 8 files

我可以使用以下代码查找最高级别的所有文件(使用所需的数字更改x.times)。

1.times.flat_map {|level| Dir.glob("./*#{'/*' *level}/*stackov*")}
# ["./level_1_b/stackov-file", "./level_1_a/file-stackov", "./level_1_a/stackov-file"]

2.times.flat_map {|level| Dir.glob("./*#{'/*' *level}/*stackov*")}
# ["./level_1_b/stackov-file", "./level_1_a/file-stackov", "./level_1_a/stackov-file"]

3.times.flat_map {|level| Dir.glob("./*#{'/*' *level}/*stackov*")}
# [
#  "./level_1_b/stackov-file", "./level_1_a/file-stackov", "./level_1_a/stackov-file", 
#  "./level_1_a/level_2_a/level_3_a/file-stackov", "./level_1_a/level_2_a/level_3_a/stackov-file"
# ]

4.times.flat_map {|level| Dir.glob("./*#{'/*' *level}/*stackov*")}
# [
#   "./level_1_b/stackov-file", "./level_1_a/file-stackov", "./level_1_a/stackov-file", 
#   "./level_1_a/level_2_a/level_3_a/file-stackov", "./level_1_a/level_2_a/level_3_a/stackov-file", 
#   "./level_1_b/level_2_b/level_3_b/level_4_b/stackov-file", "./level_1_a/level_2_a/level_3_a/level_4_a/file-stackov", 
#   "./level_1_a/level_2_a/level_3_a/level_4_a/stackov-file"
# ]