Использование команды basename в сценариях Bash

популярный
ПОВЫСИТЕ УРОВЕНЬ НАСТРОЙКИ СЕРВЕРА! ПРИМЕНИТЕ AVA И ЗАПУСК С 15% СКИДКА
ИСПОЛЬЗУЙТЕ ПРОМО:

Использование команды basename в сценариях Bash

В сценариях Bash одной из самых распространенных задач является манипуляция путями к файлам — особенно когда из полного пути нужно извлечь только имя файла. Именно здесь на помощь приходит команда basename. Несмотря на кажущуюся простоту, basename имеет мощные возможности при правильном использовании в более сложных сценариях, инструментах автоматизации, хостингах и средах CI/CD.

Что такое basename?

Команда basename удаляет путь к каталогу и, по желанию, расширение файла, оставляя только базовое имя (последний компонент пути к файлу).

🔧 Основной синтаксис:

✅ Простые примеры:

Зачем использовать basename в сценариях?

Вот лишь несколько примеров реальных потребностей в сценариях:

Практические примеры использования сценариев Bash

📁 1. Переход по файлам с ведением журнала

Этот скрипт перебирает файлы .log, извлекает имя без расширения и записывает каждое действие в журнал. basename упрощает работу с именами файлов без сложной нарезки строк.

📂 2. Использование basename для динамических путей к файлам

Допустим, вы получаете полные пути из пользовательского ввода или от другого процесса:

#!/bin/bash
input_path="$1"
filename=$(basename "$input_path")
echo "The file name is: $filename"

Использование basename в скрипте обеспечивает гибкость при работе с динамическими путями к файлам, особенно в таких средах, как Linux VPS, где журналы, файлы конфигурации и резервные копии могут находиться в разных каталогах. Это делает ваш скрипт надежным независимо от того, передается ли ему полный путь, например /var/log/syslog, или относительный файл, например ./config.txt.

🧪 3. Комбинирование basename и dirname

Используйте их вместе, чтобы выделить элементы пути:

#!/bin/bash
path="/etc/nginx/nginx.conf"
echo "Directory: $(dirname "$path")"
echo "Filename: $(basename "$path")"

Удаление расширений файлов с помощью basename

Если вы хотите удалить известные расширения:

⚠️ Примечание: Это работает только при точном совпадении суффикса. Так что .txt работает, а .TXT или .tar.gz — нет, если они не указаны явно.

Для нескольких расширений используйте basename вместе с другими инструментами:

file="/tmp/data/archive.tar.gz"
filename=$(basename "$file")
clean_name=${filename%%.*}
echo "$clean_name"
# Output: archive

Или:

basename vs Расширение параметров

Хотя basename интуитивно понятен, он порождает подпроцесс. Для скриптов, критичных к производительности, или больших циклов предпочтите чистые альтернативы Bash:

Bash Native Equivalent:

Удалите расширение с помощью встроенного Bash:

✅ Быстрее, чем вызов внешнего basename.

Пример: Переименование файлов в массовом порядке

Допустим, вы хотите снабдить все файлы .jpg префиксом с сегодняшней датой: