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 LastIndexOf
metodo in Ruby?
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 LastIndexOf
metodo in Ruby?
Risposte:
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.
pathname
funziona con i nomi dei percorsi locali mentre File
assume sempre i nomi dei percorsi Unix (la differenza è il percorso e i separatori di unità che vengono utilizzati in MS Windows, ad esempio)
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"
Pathname.new("some/path/to/my.file").basename
ottenere my.file/
: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?
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"
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.
Prova questo codice
Uso extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
La risposta di Jonathon è migliore, ma farti sapere somelist[-1]
è una delle LastIndexOf
notazioni disponibili.
Come somelist.last
apparentemente 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"
Si noti che le stringhe di virgolette doppie sfuggono a \ 's.
'C:\projects\blah.dll'.split('\\').last
File.basename
. E, come alcune delle altre risposte, non risponde alla domanda del PO.
Se hai accesso alle variabili ENV, scan
combinate 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 scan
e il regex su qualsiasi nome di percorso che include il nome file, ed __FILE__
è la scelta ovvia:
__FILE__.scan(/\w+\.\w+$/)