У скриптах Bash однією з найпоширеніших задач є маніпулювання шляхами до файлів – особливо, коли вам потрібно витягти лише ім’я файлу з повного шляху. Саме для цього і потрібна команда basename. Незважаючи на те, що basename здається простою, вона має потужні можливості при правильному використанні в більш складних скриптах, інструментах автоматизації, хостингових сервісах і середовищах CI/CD.
Команда basename вилучає шлях до каталогу і, за бажанням, вилучає розширення файлу, залишаючи лише основну назву (останній компонент шляху до файлу).
Ось лише кілька прикладів реальних потреб скриптів:
Ведення журналів: Витягнути ім’я оброблюваного файлу журналу.
Архівація: Додати до стисненого архіву лише ім’я файлу.
Автоматизація: Обробляти пакети файлів і генерувати імена вихідних файлів.
Конвеєри: Витягувати імена файлів з кроками CI/CD.
Цей скрипт циклічно переглядає .log-файли, витягує ім’я без розширення і записує кожну дію в журнал. basename спрощує обробку імен файлів без складного розбиття рядка на частини.
Припустимо, ви отримуєте повні шляхи від користувача або іншого процесу:
#!/bin/bash
input_path="$1"
filename=$(basename "$input_path")
echo "Ім'я файлу: $filename"
Використання базового імені в скрипті забезпечує гнучкість при роботі з динамічними шляхами до файлів, особливо в таких середовищах, як Linux VPS, де журнали, конфігураційні файли і резервні копії можуть знаходитися в різних директоріях. Це робить ваш скрипт надійним незалежно від того, чи передається повний шлях, наприклад, /var/log/syslog, чи відносний файл, наприклад, ./config.txt.
Використовуйте їх разом, щоб ізолювати елементи шляху:
#!/bin/bash
input_path="$1"
filename=$(basename "$input_path")
echo "The file name is: $filename"
Якщо ви хочете видалити відомі розширення:
⚠️ Примітка: Це працює, тільки якщо суфікс точно збігається. Отже, .txt працює, але .TXT або .tar.gz не працюватимуть, якщо не вказано явно.
Для декількох розширень комбінуйте базову назву з іншими інструментами:
file="/tmp/data/archive.tar.gz"
filename=$(basename "$file")
clean_name=${filename%%.*}
echo "$clean_name"
# Output: archive
Або:
Хоча базове ім’я інтуїтивно зрозуміле, воно породжує підпроцес. Для критично важливих до продуктивності скриптів або великих циклів віддавайте перевагу чистим альтернативам Bash:
✅ Швидше, ніж викликати зовнішнє ім’я бази.
Припустимо, ви хочете додати до префікса всіх файлів .jpg сьогоднішню дату: