Ruby의 파일 경로에서 확장자가없는 파일 이름을 얻는 방법


233

Ruby의 파일 경로에서 파일 이름을 얻으려면 어떻게해야합니까?

예를 들어 경로가 "C:\projects\blah.dll"있고 "blah"를 원하면

거기에 LastIndexOf루비 방법은?


3
점 다음에 일부 (세 개) 문자가 나오는 특별한 점은 없습니다. 그것들은 파일 이름의 일부입니다. 일부 프린지 운영 체제는 파일 이름의 해당 부분에 특별한 것이 있다고 생각하지만 그 함정에 빠지지 않아야합니다.
James Moore

답변:


94
require 'pathname'

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

나는 오랫동안 Windows 사용자가 아니었지만 Pathname rdoc은 Windows의 디렉토리 이름 구분 기호에 문제가 없다고 말합니다.


86
File.basename에 'pathname'의 추가 '필수'가 필요하지 않을 때 이것이 왜 1 위의 답변인지 모르겠습니다.
GroovyCakes

11
클래스 pathname는 로컬 경로 이름과 함께 작동하지만 File항상 Unix 경로 이름을 가정합니다 (예 : MS Windows에서 사용되는 경로 및 드라이브 구분 기호)
nimrodm

3
OP에 의해 승인되었지만이 답변은 실제로 OP의 질문에 응답하지 않습니다. Jonathan Lonowski와 Arup Rakshit의 답변을 참조하십시오.
GSnyder

6
확장이 있으면 확장이 존재합니다. 답이 틀렸다.
Ludovic Kuty 2016 년

4
자신의 게시물을 손상시키지 마십시오. 감사!
NobodyNada

586

시험 File.basename

로컬 파일 시스템에서 사용되는 구분 기호에 관계없이 슬래시 (``/ '')를 사용하여 file_name에 지정된 파일 이름의 마지막 구성 요소를 반환합니다. file_name의 끝에 접미사가 제공되고 존재하면 제거됩니다.

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

귀하의 경우 :

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

리눅스와 루비 1.8으로 나는 시도 Pathname.new("some/path/to/my.file").basename하고 얻을 my.file/: '(
java.is.for.desktop

67
보다 일반적으로,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti

대답은 @kelloti의 솔루션을 추가하는 것입니다.
ymoreau

@ 켈 로티 : /my/file.tar.gz어때요?
Richard-Degenne

56

확장명을 알 수없는 경우 (/ 구분 기호 필요) :

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 ()이 답입니다!
sivabudh 2016 년

26

Jonathan Lonowski 는 완벽하게 답변했지만 여기에 언급 된 답변이 없습니다. 대신에 File::extname직접 a '.*'를 사용 하여 파일 이름을 얻을 수 있습니다 .

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

그러나 특정 확장 파일 의 기본 파일 이름을 얻으려면 을 사용해야합니다 File::extname. 그렇지 않으면 그렇지 않습니다.


13

이 코드를 사용해보십시오

사용하다 extname

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

8

Jonathon의 답변이 더 좋지만 알려주 somelist[-1]는 것은 LastIndexOf사용 가능한 표기법 중 하나입니다 .

krusty.ar가 somelist.last분명히 언급했듯이 .

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
그와 함께 문제는 당신이 백 슬래시 또는 forwardslash 있는지 알 필요가있다
조셉 르 Brech

4

큰 따옴표 문자열은 \를 이스케이프합니다.

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

5
경로가 아닌 문자열로만 처리하면 코드의 이식성이 떨어집니다.
보트 코더

이것은 필요한 것보다 훨씬 복잡하며 Windows마다 다릅니다. 당신은 단지 할 수 있습니다 File.basename. 그리고 다른 답변들과 마찬가지로 OP의 질문에 대답하지 않습니다.
Keith Bennett

0

ENV 변수에 액세스 할 수 scan있는이 작은 정규식 (마지막 한 단어, 점, 문자열의 마지막 단어를 찾는)과 결합하면 파일 이름이 'filename'에 저장됩니다.

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

분명히 scan파일 이름을 포함하는 경로 이름에 대해 정규식을 사용할 수 __FILE__있으며 확실한 선택입니다.

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

-5

다음을 사용하여 현재 스크립트의 디렉토리 경로를 얻을 수 있습니다.

File.dirname __FILE__

문제는 경로에 관한 것이 아니라 파일 이름 에 관한 것 입니다. " 루비의 파일 경로에서 파일 이름 을 어떻게 얻을 수 있습니까?"
fontno

즉 다음과 같습니다File.basename __FILE__
사무엘
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.