Извлечение каталога и имени из полного пути к файлу

Задача: в теле скрипта (на bash) с помощью регулярных выражений присвоить переменным значения.

Существует файл конфигурации (назовем его config.txt), некоторый скрипт .sh и уже написанные мной шаблоны регулярных выражений: для поиска директории в строках файла config.txt ("((?:[a-zA-Z]:){0,1}(?:[\/][\w.]+){1,1000})") и для поиска расширений файлов в строках того же файла config.txt ("(.\w+)").

В чем конкретно состоит задача: получить в нужные переменные соответствующие значения (например, в переменную mydir нужно получить спарсенный с помощью указанного выше шаблона путь, а в переменную extension - расширение, полученное аналогичным путем).

Задача кажется простой, но за неимением опыта в написании скриптов на bash пока не могу ее решить.


Ответы (1 шт):

Автор решения: aleksandr barakin

для получения из полного пути к файлу имени каталога и имени файла можно использовать программы dirname и basename:

$ p=/a/b/c/d.e.f.g
$ d=$(dirname $p)
$ echo $d
/a/b/c
$ n=$(basename $p)
$ echo $n
d.e.f.g

также можно воспользоваться встроенным в posix-совместимые оболочки средством parameter expansion:

$ p=/a/b/c/d.e.f.g
$ d=${p%/*}
$ echo $d
/a/b/c
$ n=${p##*/}
$ echo $n
d.e.f.g

то же самое средство можно использовать и для разбиения имени файла на части, используя символ точка в качестве разделителя (ошибочно-традицинно и не совсем уместно многие продолжают использовать в таких случаях термин «расширение»):

$ n=d.e.f.g
$ echo ${n%%.*}
d
$ echo ${n%.*}
d.e.f
$ echo ${n#*.}
e.f.g
$ echo ${n##*.}
g

а можно и в массив поместить все части имени, разделённые символом точка. например, так:

$ n=d.e.f.g
$ m=(${n//./ })
$ echo ${m[*]}
d e f g
$ for i in ${m[*]}; do echo $i; done
d
e
f
g
→ Ссылка