Ну что такое! Может быть, я чего-то не понял?
Понадобилось для скрипта по конвертированию видеофайлов вычислять расширение файла, чтобы заменить его на другое. Например, чтобы сделать такой скрипт:
#!/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
Понадобилось для скрипта по конвертированию видеофайлов вычислять расширение файла, чтобы заменить его на другое. Например, чтобы сделать такой скрипт:
#!/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 комментариев:
BASENAME=$(echo $1 | sed 's/\(.*\)\..*$/\1/g')
И кавычки не забывай, когда аргументы указываешь - в именах файлов всяяякое встречается...
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
Вижу, что вы не поняли задачи. Мне не нужно basename, мне нужно то, что ПОСЛЕ последней точки.
Тогда уж так:
BASENAME=$(echo 'file.ext1.ext.2' | sed 's/.*\.\([^.]*\)$/\1/g')
Вот это то что надо)) Благодарю за мысль.
Отправить комментарий