¿Cómo dividir una cadena de directorio en Ruby?




ruby system command (3)

La respuesta correcta es usar el Pathname de Pathname de Ruby (clase incorporada desde 1.8.7, no una gema).

Ver el codigo

require 'pathname'

def split_path(path)
    Pathname(path).each_filename.to_a
end

Hacer esto descartará la información si la ruta fue absoluta o relativa. Para detectar esto, puedes llamar absolute? método en Pathname de Pathname .

Fuente: https://ruby-doc.org/stdlib-2.3.3/libdoc/pathname/rdoc/Pathname.html

En rubí, soy capaz de hacer

File.dirname("/home/gumby/bigproject/now_with_bugs_fixed/32/FOO_BAR_2096.results")

y obten

"/home/gumby/bigproject/now_with_bugs_fixed/32"

pero ahora me gustaría dividir esa cadena de directorio en los componentes de la carpeta individual, es decir, algo como

["home", "gumby", "bigproject", "now_with_bugs_fixed", "32"]

¿Hay una manera de hacerlo que no sea usar

directory.split("/")[1:-1]

No hay una función incorporada para dividir una ruta en sus directorios de componentes, como si se uniera a ellos, pero puede intentar simularla de forma multiplataforma:

directory_string.split(File::SEPARATOR)

Esto funciona con rutas relativas y en plataformas que no son Unix, pero para una ruta que comienza con "/" como directorio raíz, obtendrá una cadena vacía como su primer elemento en la matriz, y querríamos "/" cambio.

directory_string.split(File::SEPARATOR).map {|x| x=="" ? File::SEPARATOR : x}

Si solo desea los directorios sin el directorio raíz como mencionó anteriormente, puede cambiarlo para seleccionarlo desde el primer elemento.

directory_string.split(File::SEPARATOR).map {|x| x=="" ? File::SEPARATOR : x}[1..-1]

Advertencia: Esta solución ya no es la mejor. Ver mi otro

En realidad, hay una solución más ordenada. La idea principal es seguir haciendo estallar el nombre base hasta que solo te quede el . o / .

def split_path(path)
    array = []
    until ['/', '.'].include? path
        array << File.basename(path)
        path = File.dirname(path)
    end
    array.reverse
end

split_path 'a/b/c/d' #=> ['a', 'b', 'c', 'd']

Puedes seguir desarrollando esta idea, si lo deseas.





string