Ruby: Получить имя файла без расширений

Как я могу получить имя файла без расширений? Например, "test.html.erb" должен быть "test"

Аналогичный question. Тем не менее,

> File.basename("test.html.erb", ".*")
=> "test.html" 

EDIT: приведенный выше код - моя неудачная попытка произвести желаемый результат. Я понимаю, что неправильно использую File.basename. Таким образом, я разместил этот вопрос. Когда я говорю имя файла без расширений, я имею в виду, что после первой точки я не забочусь о вещах. Имя, которое я пытаюсь вернуть, не будет иметь точки. Кроме того, в действительном коде я передам __FILE__ вместо "test.html.erb".

Ответы

Ответ 1

Прочитайте документацию:

basename(file_name [, suffix] ) → base_name

Возвращает последний компонент имени файла, указанный в file_name, который могут быть сформированы с использованием файлов File:: SEPARATOR и File:: ALT_SEPARATOR as разделитель, если File:: ALT_SEPARATOR не равен нулю. Если указан суффикс и присутствует в конце file_name, он удаляется.

=> File.basename('public/500.html', '.html')
=> "500"

в вашем случае:

=> File.basename("test.html.erb", ".html.erb")
=> "test"

Ответ 2

Pathname обеспечивает удобный объектно-ориентированный интерфейс для работы с именами файлов.

Один метод позволяет заменить существующее расширение на новое, и этот метод принимает пустую строку в качестве аргумента:

>> Pathname('foo.bar').sub_ext ''
=> #<Pathname:foo>
>> Pathname('foo.bar.baz').sub_ext ''
=> #<Pathname:foo.bar>
>> Pathname('foo').sub_ext ''
=> #<Pathname:foo>

Это удобный способ получить имя файла, лишенное его расширения, если оно есть.

Но если вы хотите избавиться от всех расширений, вы можете использовать регулярное выражение:

>> "foo.bar.baz".sub(/\..*/, '')
=> "foo"

Ответ 3

Если вы не знаете расширение, вы можете объединить File.basename с File.extname:

filepath = "dir/dir/filename.extension"
File.basename(filepath, File.extname(filepath)) #=> "filename"

Ответ 4

Как насчет этого

File.basename(f, File.extname(f))

возвращает имя файла без расширения.. работает для имен файлов с несколькими '.' в нем.

Ответ 5

Разделить по точкам, а первая часть - то, что вы хотите.

filename = 'test.html.erb'
result = filename.split('.')[0]

Ответ 6

Учитывая предпосылку, наиболее подходящим ответом для этого случая (и подобных случаев с другими расширениями) было бы что-то вроде этого:

__FILE__.split('.')[0...-1].join('.')

Это приведет только к удалению расширения (а не к другим частям имени: myfile.html.erb здесь будет myfile.html, а не только myfile.

Ответ 7

Благодаря @xdazz и @Monk_Code для своих идей. В случае, если другие ищут, последний код, который я использую, это:

File.basename(__FILE__, ".*").split('.')[0]

Предполагая, что __FILE__ используется, и в полученной строке нет периода, это в общем случае позволяет удалить путь и расширения в передней и задней части файла соответственно.

Ответ 8

name = "filename.100.jpg"
puts "#{name.split('.')[-1]}"