Команды basename и dirname - инструменты для работы с файловыми путями в Bash. Они часто используются в скриптах, но не все знают о неочевидных возможностях. Разбираемся!
1️⃣ Быстрая обработка путей
file_path="/var/log/nginx/access.log"
echo "Файл: $(basename "$file_path")" # access.log
echo "Каталог: $(dirname "$file_path")" # /var/log/nginx
🔹 basename извлекает имя файла
🔹 dirname оставляет только путь к каталогу
2️⃣ Работа с расширениями. Можно удалить расширение файла с помощью basename:
basename "/home/user/script.sh" .sh # Выведет: script
📌 Это полезно, например, при генерации логов:
log_file="$(basename "$0" .sh).log"
echo "Логи пишем в $log_file"
💡 Здесь $0 - имя запущенного скрипта.
3️⃣ Разбор путей без / в конце. Если путь оканчивается на /, dirname может вернуть неожиданный результат:
dirname "/etc/nginx/" # Выведет: /etc
dirname "/etc/nginx" # Выведет: /etc
📌 Чтобы избежать проблем, лучше заранее удалять слеши:
path="/etc/nginx/"
dirname "${path%/}" # /etc/nginx
4️⃣ Разделение относительных и абсолютных путей. Хотим понять, абсолютный ли путь передан в скрипт?
path="./script.sh"
if [[ "$(dirname "$path")" == "." ]]; then
echo "Это относительный путь"
else
echo "Это абсолютный путь"
fi
5️⃣ Комбинируем с find и xargs. Переименовываем все .txt файлы в .bak, сохраняя имена:
find /path/to/files -name "*.txt" | while read file; do
mv "$file" "$(dirname "$file")/$(basename "$file" .txt).bak"
done
📌 Здесь basename убирает .txt, а dirname сохраняет путь.
BashTex 📱 #linux #utils