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?

 216
Author: the Tin Man, 2008-12-17

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.

 93
Author: NobodyNada,
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"
 570
Author: Jonathan Lonowski,
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"
 54
Author: Vinko Vrsalovic,
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.

 20
Author: Arup Rakshit,
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" 
 9
Author: Rahul Patel,
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"
 7
Author: monkut,
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
 4
Author: krusty.ar,
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+$/)
 0
Author: Dave Everitt,
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__
 -5
Author: Smar,
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