¿Cuál es la forma más rápida, optimizada y de una sola línea de obtener una matriz de directorios (excluyendo archivos) en Ruby?
¿Qué tal incluir archivos?
¿Cuál es la forma más rápida, optimizada y de una sola línea de obtener una matriz de directorios (excluyendo archivos) en Ruby?
¿Qué tal incluir archivos?
Respuestas:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
En lugar de Dir.glob(foo)
usted también puede escribir Dir[foo]
(sin embargo Dir.glob
también puede tener un bloque, en cuyo caso se producirá cada ruta en lugar de crear una matriz).
Dir.glob("**/")
menos que también desee enlaces simbólicos
File::FNM_DOTMATCH
bandera.
Dir.glob("**/*", File::FNM_DOTMATCH)
Creo que ninguna de las soluciones aquí trata con directorios ocultos (por ejemplo, '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
Fue útil para mí
Para obtener una lista de directorios, intente
Dir['**/']
La lista de archivos es más difícil, porque en Unix el directorio también es un archivo, por lo que debe probar el tipo o eliminar las entradas de la lista devuelta, que es padre de otras entradas.
Dir['**/*'].reject {|fn| File.directory?(fn) }
Y para una lista de todos los archivos y directorios simplemente
Dir['**/*']
Solo directorios
`find -type d`.split("\n")
Directorios y archivos normales
`find -type d -or -type f`.split("\n")`
require "pathname"
def rec_path(path, file= false)
puts path
path.children.collect do |child|
if file and child.file?
child
elsif child.directory?
rec_path(child, file) + [child]
end
end.select { |x| x }.flatten(1)
end
# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
end.select {}.flatten()
parte? Me gusta la función en general. ¿Parece que eso creará una matriz de matrices? ¿Sería posible hacer la elseif
parte con: rec_path(child, file) << child.to_s
para poder asignarlo a una matriz y obtener una matriz de cadenas? ¡Gracias!
Como se señaló en otras respuestas aquí, puede usar Dir.glob
. Tenga en cuenta que las carpetas pueden tener muchos caracteres extraños y los argumentos globales son patrones, por lo que algunos caracteres tienen significados especiales. Como tal, no es seguro hacer algo como lo siguiente:
Dir.glob("#{folder}/**/*")
En su lugar, haz lo siguiente:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
En PHP u otros lenguajes para obtener el contenido de un directorio y todos sus subdirectorios, debes escribir algunas líneas de código, pero en Ruby se necesitan 2 líneas:
require 'find'
Find.find('./') do |f| p f end
esto imprimirá el contenido del directorio actual y todos sus subdirectorios.
O más corto, puede usar la ’**’
notación:
p Dir['**/*.*']
¿Cuántas líneas escribirás en PHP o en Java para obtener el mismo resultado?
Aunque no es una solución de una línea, creo que esta es la mejor manera de hacerlo usando llamadas ruby.
Primero elimine todos los archivos de forma recursiva
Segundo elimine todos los directorios vacíos
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
Aquí hay un ejemplo que combina el descubrimiento dinámico de un directorio de proyecto Rails con Dir.glob:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, pero todavía no podía ver las subcarpetas y archivos dentro de la carpeta de activos porRails.application.config.assets.paths