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]}"