2008-12-12

Утилитка для получения расширения файла

Ну что такое! Может быть, я чего-то не понял?
Понадобилось для скрипта по конвертированию видеофайлов вычислять расширение файла, чтобы заменить его на другое. Например, чтобы сделать такой скрипт:

#!/bin/bash
mkvmerge -o ${1%avi}mkv $1 $2


Это простой пример упаковки видео и аудиоконтента в MKV, где вместо первого аргумента скрипту подсовывается имя видеофайла, вместо второго - имя аудиофайла. Но я же не всегда работаю с avi! Значит, расширение нужно как-то автоматически вычислять.
Честное слово, я искал простой системный способ сделать это. Кроме basename ничего не нашел, но это не то, что нужно. Если он есть - подскажите!
Ну так вот, пришлось взять в руки пилу, молток и SciTE, и сварганить скрипт самому:

[ файл ~/bin/ext.py ]

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

class FileExt:
def __init__(self):
try:
self.ind=sys.argv[1].rindex(".")
self.word=sys.argv[1]
except:
self.ind=sys.argv[0].rindex(".")
self.word=sys.argv[0]
def getext(self):
return self.word[self.ind+1:]

e=FileExt()
print e.getext()


Может быть и не лучший способ, но работает! Теперь мой скрипт может стать таким:

#!/bin/bash
mkvmerge -o ${1%`ext.py $1`}mkv $1 $2


P.S. Более изящный (и короткий) вариант кода:

import sys,os
try:
path,ext=os.path.splitext(sys.argv[1])
print str(ext).lower()
except:
print "Неверный аргумент"

5 комментариев:

Rush комментирует...

BASENAME=$(echo $1 | sed 's/\(.*\)\..*$/\1/g')

Rush комментирует...

И кавычки не забывай, когда аргументы указываешь - в именах файлов всяяякое встречается...

Kawaikunee комментирует...

Rush: Эта строка работает только для файлов с одной точкой в имени. А если их больше - то отдает все после первой точки.

Rush комментирует...

rush@rush-workstation:~$ echo "file.ext1.ext2" | sed 's/\(.*\)\..*$/\1/g'
file.ext1
rush@rush-workstation:~$ echo "file.ext1.ext2.ext3" | sed 's/\(.*\)\..*$/\1/g'
file.ext1.ext2
rush@rush-workstation:~$

Что я делаю не так ? :D

Kawaikunee комментирует...

Вижу, что вы не поняли задачи. Мне не нужно basename, мне нужно то, что ПОСЛЕ последней точки.
Тогда уж так:
BASENAME=$(echo 'file.ext1.ext.2' | sed 's/.*\.\([^.]*\)$/\1/g')
Вот это то что надо)) Благодарю за мысль.