Хаа.. Привет! Сегодня будем извлекать расширение и имя файла на bash. Для чего? А почему бы и нет! На самом деле это нужно знать, это база. Я часто вижу как это делают люди с помощью какой-то зиготы 🤒 (регулярки/awk/sed), ну боль же. Не надо ничего усложнять, есть вещи на порядок выше.
Что такое имя файла и расширение, объяснять не буду, как говорил мой техдир —заебал, если интересно, сходи погугли.
Теперь по делу. Берем какой-нибудь подопытный файл, пусть будет: bashdays.gzip и накидываем скрипт.
Символ
Символ
Если бы файл назывался bashdays,gzip (через запятую), то наш скрипт, нужно было бы немного адаптировать под эту запятую.
Это один из способов реализовать желаемое. Но есть и другой. Давай воспользуется командой basename.
Команда basename в Linux печатает последний компонент в пути к файлу. Это особенно полезно в скриптах bash, где вы хотите извлечь имя файла из длинного пути к файлу.
Если тебе заранее известно расширение файла, в нашем случае оно известно как gzip. То мы сможем отсечь расширение такими способами (они идентичны):
Еще есть ключ -a, в который можно передать несколько путей и извлечь сразу пачку. Но я ни разу не видел, что бы такое использовали где-то, так что можно забить.
С basename вроде всё, дальше у нас по списку dirname.
Команда dirname в Linux печатает путь к файлу с удаленным последним компонентом. Это в основном дает вам путь к каталогу из пути к файлу.
Переменная IFS (внутренний разделитель полей) используется для указания определенного разделителя для разделения строк.
Выхлоп скрипта будет таким:
Уффф.. Как-то много букв получилось, пардон. Основные моменты рассмотрели, надеюсь твой интерес я удовлетворил. Спасибо за внимание, ставь лайк. А вечером закину еще что-нибудь занимательное. Давай, на связи!
tags: #bash #linux
—
🟢 Подпишись: @bashdays
Что такое имя файла и расширение, объяснять не буду, как говорил мой техдир —
Теперь по делу. Берем какой-нибудь подопытный файл, пусть будет: bashdays.gzip и накидываем скрипт.
#!/bin/bashВ переменной FILE заносим имя файла bashdays с расширением gzip. Далее в переменной FIRST отсекаем расширение gzip, в переменной SECOND отсекаем имя bashdays. По итогу на экран выведется такая шляпа:
FILE="bashdays.gzip"
FIRST="${FILE%.*}"
SECOND="${FILE##*.}"
echo $FIRST
echo $SECOND
bashdaysПонял? Легкотня, без гигантских регулярок и гавнокода. Сейчас объясню подробнее, что происходит.
gzip
Символ
%.*
означает отсекание всего после точки.Символ
##*.
ну а тут наоборот, отсекание всего до точки.Если бы файл назывался bashdays,gzip (через запятую), то наш скрипт, нужно было бы немного адаптировать под эту запятую.
FIRST="${FILE%,*}"Проще уже не объяснишь. Если не дошло, сам потыкай на примерах и уже точно въедешь в тему, на практике само собой всё проще и понятнее.
SECOND="${FILE##*,}"
Это один из способов реализовать желаемое. Но есть и другой. Давай воспользуется командой basename.
Команда basename в Linux печатает последний компонент в пути к файлу. Это особенно полезно в скриптах bash, где вы хотите извлечь имя файла из длинного пути к файлу.
Если тебе заранее известно расширение файла, в нашем случае оно известно как gzip. То мы сможем отсечь расширение такими способами (они идентичны):
basename /tmp/bashdays.gzip .gzipВ обоих случаях на экран выведется:
basename -s .gzip /tmp/bashdays.gzip
bashdays
Ключ -s удаляет завершающее расширение файла, но можно и из коробки запускать, не указывая его.Еще есть ключ -a, в который можно передать несколько путей и извлечь сразу пачку. Но я ни разу не видел, что бы такое использовали где-то, так что можно забить.
С basename вроде всё, дальше у нас по списку dirname.
Команда dirname в Linux печатает путь к файлу с удаленным последним компонентом. Это в основном дает вам путь к каталогу из пути к файлу.
dirname /usr/local/sbinРезультат будет таким:
dirname /tmp/bashdays.gzip
dirname /usr/bin/date
/usr/local/Ну а чо, вообще шикарно! Ну и вишня для гиков, магия с переменной $IFS.
/tmp/
/usr/bin/
Переменная IFS (внутренний разделитель полей) используется для указания определенного разделителя для разделения строк.
_file="/tmp/bashdays.gzip"Кратенько: Определяем имя файла, задаем переменную IFS для извлечения имени файла и расширения, указываем разделитель «.» (точка), выполняем set для разделения на позиционные параметры, ну и выводим все на экран с помощью printf (но можно и через echo).
OLDIFS="$IFS"
IFS='.'
set -- $_file
IFS="$OLDIFS"
printf "File: %s\nExt: %s\n" "$1" "$2"
Выхлоп скрипта будет таким:
File: /tmp/bashdaysКоманда set — это встроенная команда оболочки, которая позволяет отображать или устанавливать переменные оболочки и среды.
Ext: gzip
Уффф.. Как-то много букв получилось, пардон. Основные моменты рассмотрели, надеюсь твой интерес я удовлетворил. Спасибо за внимание, ставь лайк. А вечером закину еще что-нибудь занимательное. Давай, на связи!
tags: #bash #linux
—