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