Подтвердить что ты не робот

Как получить количество файлов в каталоге с помощью ruby

используя ruby, как получить количество файлов в данном каталоге, количество файлов должно включать подсчет из рекурсивных каталогов.

Например: folder1 (2 файла) ----- > folder2 (4 файла)   и папка2 находится внутри папки1. общий счет для вышеуказанного случая должен быть 6 файлов.

есть ли какая-либо функция в ruby, которая возвращает мне этот счет.

4b9b3361

Ответ 1

Самый быстрый способ должен быть (не включая каталоги в счете):

Dir.glob(File.join(your_directory_as_variable_or_string, '**', '*')).select { |file| File.file?(file) }.count

И короче:

dir = '~/Documents'
Dir[File.join(dir, '**', '*')].count { |file| File.file?(file) }

Ответ 2

Все, что вам нужно, это запустить в текущем каталоге.

Dir["**/*"].length

Он подсчитывает каталоги как файлы.

Ответ 3

Небольшая модификация и комментарий

Dir['**/*'].count { |file| File.file?(file) }

работает для меня в Ruby 1.9.3 и короче.

Предостережение, по крайней мере, на моем ящике Windows 7, заключается в том, что Dir['somedir/**/*'] не работает. Я должен использовать

cd(somedir) { Dir['**/*'] }

Ответ 4

Вы также можете пойти на голые кости и выполнить системную команду:

count = `ls -1 #{dir} | wc -l`.to_i 

Ответ 5

Как насчет следующего:

find . -typef|wc -l

Кроме того, каковы недостатки использования этого метода Dir.count?

Ответ 6

Попробуйте:

//we suppose that the variable folder1 is an absolute path here
pattern = File.join(folder1, "**", "*")
count = Dir.glob(pattern).count

Ответ 7

Просто сейчас нужно было найти способ получить список файлов из общего сетевого ресурса, который занимал много времени с Dir.glob, Filelist из Rake Gem, кажется, является решением, следует эталонный тест. Совместное использование находится на сервере Windows, сценарий Eran на рабочем столе Windows 10, Ruby 2.3.0 X64. В общей папке Netork было 754 файла, а значит 320 CSV, где я искал. Некоторые файлы были в подпапках.

require 'rake'
require 'benchmark'

source_path = '//server/share/**/*.csv'
puts FileList.new(source_path).size #320
puts Dir.glob(source_path).length #320
puts Dir[source_path].length #320

Benchmark.bm do |x| 
  x.report("FileList  ") { 1.times { FileList.new(source_path) } }
  x.report("Dir.glob  ") { 1.times { Dir.glob(source_path) } }
  x.report("Dir[]     ") { 1.times { Dir[source_path] } } 
end 

дает

       user     system      total        real
FileList    0.000000   0.000000   0.000000 (  0.000073)
Dir.glob    0.031000   0.406000   0.437000 ( 11.324227)
Dir[]       0.047000   0.563000   0.610000 ( 11.887771)

Старый ответ:

Самый быстрый способ в Windows для очень больших папок - использовать версию командной строки для поиска всего, например, не знаю, есть ли в Linux что-то вроде "Искать все". Если это так, сообщите нам.

ES = 'C:\Users\...\everything\es\es.exe'

def filelist path
  command = %Q{"#{ES}" "#{path}\\*"}
  list = []
  IO.popen(command+" 2>&1") do |pipe|
    while lijn = pipe.gets
      list << lijn
    end
  end
  list
end

filelist(path).count

смотрите здесь результаты для сравнительно небольшой папки (файлы +800)

Benchmark.bmbm do |x| 
  x.report("glob      ") { filelist(path).count }
  x.report("everything") { Dir.glob("#{folder}/**/*").count } 
end 

Rehearsal ----------------------------------------------
glob         0.000000   0.032000   0.032000 (  0.106887)
everything   0.000000   0.000000   0.000000 (  0.001979)
------------------------------------- total: 0.032000sec

                 user     system      total        real
glob         0.016000   0.015000   0.031000 (  0.110030)
everything   0.000000   0.016000   0.016000 (  0.001881)

Ответ 8

Используя ~/Documents в качестве примера.

Однострочный код:

Dir['~/Documents'].length

Для более длинных путей одна строка может быть менее читаемой, поэтому:

path = '~/Documents/foo/bar'

Dir[path].length