2010-12-22 16 views

Respuesta

21

No utilice globbing, en su lugar use Find. Find está diseñado para darle acceso a los directorios y archivos a medida que se encuentran, y usted decide programáticamente cuándo rescatar de un directorio y pasar al siguiente. Vea el ejemplo en la página del documento.

Si desea continuar utilizando globbing esto le dará un lugar de partida. Puede poner varias pruebas en reject usando OR entre ellos:

Dir['**/*.h'].reject{ |f| f['/path/to/skip'] || f[%r{^/another/path/to/skip}] }.each do |filename| 
    puts filename 
end 

puede utilizar cualquiera cuerdas fijas o expresiones regulares en las pruebas.

+0

no puedo encontrar la manera de utilizar .reject correctamente. ¿No admite los mismos comodines que .glob? Me gustaría ... rechazar {| f | f ['**/*. tmpl.html']} .each {... – SimplGy

+2

también no ... .reject { | f | File.fnmatch ('** .tmpl.html', f) } .each {... :) – SimplGy

+1

Entendido, mi comprensión de la coincidencia de rutas era incorrecta. double star no significa que coincidirá en ningún directorio, aún necesita un directorio de contexto. Works: .reject { | f | File.fnmatch ('../../../ main/webapp/**. Tmpl.html', f) – SimplGy

3

Una manera:

require 'find' 

ignores = ['doc','test','specifications'] 

Find.find(ENV['HOME']) do |path| 
    name = File.basename(path) 
    if FileTest.directory?(path) 
    if ignores.include?(name) 
     Find.prune 
    else 
     next 
    end 
    else 
    puts path if name =~ /.h$/ 
    end 
end 
16

Hay FileList de la gema Rake (que casi siempre se instala por defecto, y se incluye en la biblioteca estándar de Ruby 1.9):

files = FileList['**/*.h'].exclude('skip_me') 

FileList tiene mucha funcionalidad para trabajar con globs de manera eficiente.

Puede encontrar la documentación aquí: http://rake.rubyforge.org/classes/Rake/FileList.html

42

Sé que esto es de 4 años tarde, pero para nadie más que pudiera correr a través de esta pregunta se puede excluir de Dir la misma forma que lo haría excluir de comodines Bash:

Dir["lib/{[!errors/]**/*,*}.rb"] 

Lo que excluirá cualquier carpeta que comience con "errores" incluso podría omitir el / y convertirlo también en un comodín si lo desea.

+2

def no tarde en absoluto, ¡gracias! – shicholas

+1

esta debería ser la respuesta aceptada ahora – dft

+0

Igual va para los archivos en caso de que sea necesario: vistas de "Dir.glob"/{[! Partial _]} *. Slim "' Explicado: Estás leyendo el directorio de tus vistas y cada archivo que comienza con 'partial_' tiene que ser excluido. Los archivos .slim restantes se mostrarán. – three

3
files = Dir.glob(pattern) 
files -= Dir.glob("#{exclude}/**/*") 
0

esto es similar a algunas otras respuestas acaba de escribir un poco diferente

Ill crear una matriz que se puede pasar a una iteración .Cada o alguna otra cosa.

release_safelist = Dir.glob ('*'). Rechazo {| archivo | (archivo == "enlaces de software") || (archivo == "ci") || (File.include? "Instantánea")}

En este caso im creación de una matriz sin archivos/dir llamado ya sea ci, enlaces simbólicos, o que contiene INSTANTÁNEA

Cuestiones relacionadas