bash, парсинг имени файла и пути к нему

bash имеет встроенные функции манипуляции со строками. В частности функции удаления подстрок.

${string#substring} — удаляет кратчайшее вхождение подстроки $substring от начала строки $string.

${string##substring} — удаляет длиннейшее вхождение подстроки $substring от начала строки $string.

Аналогичным образом действует оператор % но действует от конца строки.

${string%substring} — удаляет кратчайшее вхождение подстроки $substring в конце строки $string.

${string%%substring} — удаляет длиннейшее вхождение подстроки $substring в конце строки $string.

При помощи этих функций можно получить имя файла, путь к файлу и его расширение:

# переменная для работы содержащая полное имя и путь к файлу
fullpathname="/root/temp/file.tar.gz"

# Получить путь (часть от начала строки до последнего слева слеша)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%/*}"
/root/temp

# Получить имя файла (часть от самого правого слеша до конца строки)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname##*/}"
file.tar.gz

# Получить строку левее самой левой точки
# !!! Если точка будет находиться в пути, то отрежет по ней
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%%.*}"
/root/temp/file

# Получить путь и имя файла без расширения (удаляет все правее самой правой точки)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%.*}"
/root/temp/file.tar

# Получить расширение (правая часть от последней слева точки в имени файла)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname##*.}"
gz

# Все расширения (правая часть от первой слева точки в имени файла)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname#*.}"
tar.gz

# Удаление любого расширения
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%.*}"
/root/temp/file.tar

# Удаление расширения .gz
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%.gz}"
/root/temp/file.tar

# Замена расширения .gz на .doc
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%.gz}.doc"
/root/temp/file.tar.doc

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

fullpathname="/root/temp/file.tar.gz"
              |--------------------|   - fullname
              ^--------^               - path
                         ^---------^   - name
                                  ^^   - extension
             #>>                       - от начала короткое удаление
            ##>>>>                     - от начала длинное удаление
                                  <<%  - от конца короткое удаление
                                <<<<%% - от конца длинное удаление

По материалам Advanced Bash-Scripting Guide