как получить количество файлов в каталоге, используя ruby - PullRequest
30 голосов
/ 21 июля 2011

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

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

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

Ответы [ 7 ]

35 голосов
/ 21 июля 2011

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

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) }
25 голосов
/ 21 июля 2011

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

Dir["**/*"].length

Он считает каталоги файлами.

7 голосов
/ 19 января 2012

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

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

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

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

cd(somedir) { Dir['**/*'] }
3 голосов
/ 24 июля 2012

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

count = `ls -1 #{dir} | wc -l`.to_i 
1 голос
/ 10 октября 2012

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

find . -typef|wc -l

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

0 голосов
/ 18 февраля 2017

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

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)
0 голосов
/ 21 июля 2011

Пожалуйста, попробуйте:

//we suppose that the variable folder1 is an absolute path here
pattern = File.join(folder1, "**", "*")
count = Dir.glob(pattern).count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...