Как получить количество файлов в каталоге с помощью ruby
используя ruby, как получить количество файлов в данном каталоге, количество файлов должно включать подсчет из рекурсивных каталогов.
Например: folder1 (2 файла) ----- > folder2 (4 файла) и папка2 находится внутри папки1.
общий счет для вышеуказанного случая должен быть 6 файлов.
есть ли какая-либо функция в ruby, которая возвращает мне этот счет.
Ответы
Ответ 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