Come ottenere il nome file senza estensione dal percorso del file in Ruby


233

Come posso ottenere il nome file da un percorso di file in Ruby?

Ad esempio, se ho un percorso di "C:\projects\blah.dll"e voglio solo il "blah".

C'è un LastIndexOfmetodo in Ruby?


3
Tieni presente che non c'è niente di speciale in un punto seguito da alcuni (tre, forse) personaggi. Fanno parte del nome del file. Alcuni sistemi operativi marginali pensano che ci sia qualcosa di speciale in quella parte di un nome file, ma non dovresti cadere in quella trappola.
James Moore,

Risposte:


94
require 'pathname'

Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>

Non sono un utente Windows da molto tempo, ma il Pathname rdoc dice che non ha problemi con i separatori di nomi di directory su Windows.


86
Non so perché questa sia la risposta classificata n. 1 quando File.basename non richiede un'ulteriore "richiesta" di "nome percorso".
GroovyCakes

11
La classe pathnamefunziona con i nomi dei percorsi locali mentre Fileassume sempre i nomi dei percorsi Unix (la differenza è il percorso e i separatori di unità che vengono utilizzati in MS Windows, ad esempio)
nimrodm

3
Nonostante sia stata accettata dal PO, questa risposta in realtà non risponde alla domanda del PO. Vedi le risposte di Jonathan Lonowski e Arup Rakshit.
GSnyder,

6
L'estensione è presente se ce n'è una. La risposta è sbagliata
Ludovic Kuty,

4
Si prega di non vandalizzare i propri post. Grazie!
Nessuno Nada

586

Provare File.basename

Restituisce l'ultimo componente del nome file indicato in nome_file, che deve essere formato usando le barre (`` / '') indipendentemente dal separatore utilizzato nel file system locale. Se il suffisso viene fornito e presente alla fine di nome_file, viene rimosso.

File.basename("/home/gumby/work/ruby.rb")          #=> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"

Nel tuo caso:

File.basename("C:\\projects\\blah.dll", ".dll")  #=> "blah"

Con Linux e Ruby 1.8 cerco di Pathname.new("some/path/to/my.file").basenameottenere my.file/: '(
java.is.for.desktop

67
Più genericamente,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti il

La risposta dovrebbe essere aggiungere la soluzione di @kelloti che è meglio.
ymoreau,

@kelloti: che dire /my/file.tar.gz?
Richard-Degenne,

56

Nel caso in cui l'estensione non sia nota (necessita del separatore /):

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"

5
File.basename () è la risposta!
sivabudh,

26

Jonathan Lonowski ha risposto perfettamente, ma c'è qualcosa che nessuna delle risposte menzionate qui. Invece di File::extname, puoi usare direttamente a '.*'per ottenere il nome del file.

File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"

Ma, se si desidera ottenere il nome del file di base di file di estensione specifici , è necessario utilizzare File::extname, altrimenti no.


13

Prova questo codice

Uso extname

 File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test" 

8

La risposta di Jonathon è migliore, ma farti sapere somelist[-1]è una delle LastIndexOfnotazioni disponibili.

Come somelist.lastapparentemente cita anche krusty.ar .

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"

1
il problema è che devi sapere se si tratta di una barra rovesciata o di una spinta in avanti
Joseph Le Brech,

4

Si noti che le stringhe di virgolette doppie sfuggono a \ 's.

'C:\projects\blah.dll'.split('\\').last

5
Lo considera puramente come una stringa, piuttosto che come un percorso, rende il codice meno portatile.
Boatcoder il

Questo è molto più complesso del necessario ed è specifico di Windows. Puoi solo File.basename. E, come alcune delle altre risposte, non risponde alla domanda del PO.
Keith Bennett,

0

Se hai accesso alle variabili ENV, scancombinate con questa piccola regex (che trova l'ultima ma una parola, un punto, quindi l'ultima parola della stringa) inserirà il nome del file in 'nomefile':

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)

Ovviamente, puoi usare scane il regex su qualsiasi nome di percorso che include il nome file, ed __FILE__è la scelta ovvia:

__FILE__.scan(/\w+\.\w+$/)

-5

Puoi ottenere il percorso della directory dello script corrente con:

File.dirname __FILE__

La domanda non riguardava il percorso, era il nome del file . "Come posso ottenere il nome del file da un percorso di file in Ruby?"
fontno,

Sarebbe:File.basename __FILE__
Samuel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.