Cómo obtener el nombre del archivo sin extensión desde la ruta del archivo en Ruby
¿Cómo puedo obtener el nombre de archivo de una ruta de archivo en Ruby?
Por ejemplo si tengo un camino de "C:\projects\blah.dll"
y solo quiero el "bla".
¿Hay un método LastIndexOf
en Ruby?
9 answers
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
No he sido un usuario de Windows en mucho tiempo, pero el nombre de ruta rdoc dice que no tiene problemas con los separadores de nombres de directorio en Windows.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-01 00:55:52
Intente File.basename
Devuelve el último componente del nombre de archivo dado en file_name, que debe formarse usando barras inclinadas (`/") independientemente del separador utilizado en el sistema de archivos local. Si se da el sufijo y está presente al final de file_name, se elimina.
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
En su caso:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-17 12:10:25
En caso de que la extensión no se conozca (necesita el separador/):
irb(main):024:0> f = 'C:\foobar\blah.txt'.gsub("\\","/")
=> "C:/foobar/blah.txt"
irb(main):027:0> File.basename(f,File.extname(f))
=> "blah"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-17 12:34:54
Jonathan Lonowski respondió perfectamente, pero hay algo que ninguna de las respuestas mencionadas aquí. En lugar de File::extname
, puede usar directamente un '.*'
para obtener el nombre del archivo.
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
Pero, si desea obtener el nombre de archivo base de cualquier archivo de extensión específico, entonces necesita usar File::extname
, de lo contrario no.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:19
Pruebe este código
Uso extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-28 14:12:41
La respuesta de Jonathon es mejor, pero haceros saber somelist[-1]
es una de las LastIndexOf
anotaciones disponibles.
As krusty.ar mencionado somelist.last
aparentemente es demasiado.
irb(main):003:0* f = 'C:\\path\\file.txt'
irb(main):007:0> f.split('\\')
=> ["C:", "path", "file.txt"]
irb(main):008:0> f.split('\\')[-1]
=> "file.txt"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-29 22:57:35
Tenga en cuenta que las cadenas de comillas dobles escapan \'s.
'C:\projects\blah.dll'.split('\\').last
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-17 12:20:24
Si tiene acceso a variables ENV, scan
combinado con esta pequeña expresión regular (que encuentra la última palabra, un punto, entonces la última palabra de la cadena) pondrá el nombre del archivo en 'filename':
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Obviamente, puede usar scan
y la expresión regular en cualquier nombre de ruta que incluya el nombre de archivo, y __FILE__
es la opción obvia:
__FILE__.scan(/\w+\.\w+$/)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-06 08:12:41
Puede obtener la ruta del directorio al script actual con:
File.dirname __FILE__
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-14 13:28:32