2011-07-21 9 views
29

usando ruby ​​para obtener el número de archivos en un directorio determinado, el recuento de archivos debe incluir el conteo de directorios recursivos.cómo hacer que los archivos cuenten en un directorio usando ruby ​​

Por ejemplo: carpeta1 (2 archivos) -----> carpeta2 (4 archivos) y carpeta2 está dentro de la carpeta1. recuento total para el caso anterior debe ser de 6 archivos.

hay alguna función en ruby ​​que me traiga este conteo.

Respuesta

31

La forma 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) } 
+0

su agradable código de una sola línea, gracias hombre –

+0

no problemo! :) –

+0

¿Puedes explicar por qué el primer método debe ser más rápido que el segundo? O tal vez entendí mal lo que querías decir con "la manera más rápida". – Automatico

23

Todo lo que necesita es, ejecute en el directorio actual.

Dir["**/*"].length 

Cuenta directorios como archivos.

0

Por favor, intente:

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

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['**/*'] } 
3

También se puede ir huesos súper desnudas y hacer un comando del sistema:

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

¿Qué hay de lo siguiente:

find . -typef|wc -l

Además, ¿cuáles son las desventajas de usar esto sobre el método Dir.count?

+1

Este comando no es portátil ya que puede no funcionar en Windows y otras plataformas que no proporcionan uno de los comandos mencionados anteriormente. – xhochy

+2

En realidad, la mayoría de las respuestas aquí no funcionarían en Windows porque usan barras inclinadas '/' –

0

La forma más rápida en ventanas para carpetas muy grandes sería utilizar el command line version of search everything así, no sé si Linus tiene algo así como Buscar todo ... Si lo hace, por favor, 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 de una carpeta relativamente pequeño (+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) 
Cuestiones relacionadas