read - cómo hacer que los archivos cuenten en un directorio usando ruby
ruby file read (7)
Usando ruby para obtener el número de archivos en un directorio determinado, el recuento de archivos debe incluir el recuento de los directorios recursivos.
Por ejemplo: carpeta1 (2 archivos) -----> carpeta2 (4 archivos) y carpeta2 dentro de la carpeta1. el recuento total para el caso anterior debe ser de 6 archivos.
¿Hay alguna función en ruby que me traiga este conteo?
¿Qué tal lo siguiente?
find . -typef|wc -l
Además, ¿cuáles son los inconvenientes de usar esto sobre el método Dir.count?
La forma más rápida en las ventanas para las grandes carpetas sería usar la versión de línea de comandos de buscar todo de esta manera, no sé si Linus tiene algo así como Buscar todo ... Si es así, háganoslo saber.
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
ver aquí los resultados para una carpeta relativamente pequeña (+800 archivos)
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)
La manera más rápida debe ser (sin incluir directorios en el recuento):
Dir.glob(File.join(your_directory_as_variable_or_string, ''**'', ''*'')).select { |file| File.file?(file) }.count
Y más corto:
dir = ''~/Documents''
Dir[File.join(dir, ''**'', ''*'')].count { |file| File.file?(file) }
Por favor, inténtalo:
//we suppose that the variable folder1 is an absolute path here
pattern = File.join(folder1, "**", "*")
count = Dir.glob(pattern).count
También podría ir muy escueto huesos y hacer un comando del sistema:
count = `ls -1 #{dir} | wc -l`.to_i
Todo lo que necesita es esto, ejecute en el directorio actual.
Dir["**/*"].length
Cuenta directorios como archivos.
Una ligera modificación y un comentario
Dir[''**/*''].count { |file| File.file?(file) }
funciona para mí en Ruby 1.9.3, y es más corto.
Una advertencia, al menos en mi caja de Windows 7, es que Dir[''somedir/**/*'']
no funciona. Tengo que usar
cd(somedir) { Dir[''**/*''] }