2011-02-20 17 views
27

¿Cómo puedo verificar si un directorio está vacío o no en Ruby? ¿Hay algo así como: (. Yo sé que esa función no existe)Comprobar si el directorio está vacío en Ruby

Dir.exists?("directory") 

+2

Me gustaría ver un método llamado "Dir.empty?" –

+0

@BenFlynn 5 años después, su deseo [se ha hecho realidad] (http://stackoverflow.com/a/41344613/2021397) – Janosch

+0

@Janosch O esto o la prueba de la existencia de ondas gravitacionales es lo mejor que puede ocurrir en 2016 –

Respuesta

46

Usted sólo puede obtener una lista de las entradas y ver por sí mismo si está o no está vacío (bueno, ya tendrá que dar cuenta de "." y ".."). Ver the docs.

(Dir.entries('your_directory') - %w{ . .. }).empty? 

# or using glob, which doesn't match hidden files (like . and ..) 
Dir['your_directory/*'].empty? 

Actualización: el primer método anterior utilizado para utilizar una expresión regular; ahora no (obviamente). Los comentarios a continuación se aplican principalmente a la versión anterior (regex).

+0

El primero me dio errores, pero el segundo funcionó perfectamente. ¡Gracias! –

+0

@Mark Szymanski: Ahh, sí, envolví el bloque entre paréntesis. Fijo. – coreyward

+0

El primer comando también ignorará los archivos ocultos, como .git embargo. –

9

Puede utilizar las entradas para ver todos los archivos y carpetas en un directorio:

Dir.entries('directory') 
=> ['.', '..', 'file.rb', '.git'] 
Dir.entries('directory').size <= 2 # Check if empty with no files or folders. 

También puede buscar archivos sólo con glob:

Dir.glob('directory/{*,.*}') 
=> ['file.rb', '.git'] 
Dir.glob('directory/{*,.*}').empty? # Check if empty with no files. 
+2

Pero 'Dir.glob ('directory/*')' omitirá los archivos que comiencen por '.', por ejemplo'.perfil' o '.git'. –

+0

@ (mu es demasiado corta) - Estás en lo cierto. Actualicé mi expresión regular para incluir archivos ocultos también. –

+3

Dir.glob ('directorio /{*,.*}') captura "." y ".." ¿tan vacío? siempre devolverá falso. –

3

un directorio vacío debe sólo tienen dos enlaces (. y ..). En OSX esto funciona:

File.stat('directory').nlink == 2 

... pero no funciona en Linux o Cygwin. (Gracias @DamianNowak) Adaptación de la respuesta de Pan:

Dir.entries('directory').size == 2 

debería funcionar.

+1

'nlink' comprueba el número de subdirectorios, lo cual es incorrecto. 'size' debe ser verificado. – Nowaker

+0

@DamianNowak No es así, intente irb File.stat ('.'). Nlink http://www.ruby-doc.org/core-1.9.3/File/Stat.html#method-i-nlink –

+0

Probé , y ... http://pastie.org/4128736 – Nowaker

1

No es sencillo, pero funciona perfectamente en los sistemas * nix.

Dir.entries(directory_path) == ['.', '..'] 
0

Aquí está mi plantilla para esta. FYI, estoy buscando una cierta coincidencia de archivos dentro de la fuente.

mydir = "/home/to/mydir" 

Dir.chdir(mydir) 

if Dir.entries(mydir).select(|x| x != '.' && x != '..' && x =~ /\regex.txt\z/).size > 0 


     do_something 

elsif Dir.entries(mydir).select(|x| x != '.' && x != '..' && x =~ /\regex.txt\z/).size < 0 

     do_something_else 

else 

     puts "some warning message" 
end 

que me haga saber si algo :)

Cuestiones relacionadas