Иногда при работе в командной строке (особенно при работе с shell-скриптами) вас может интересовать только имя файла, а вам доступен только полный путь к нему. Поэтому требуется удалить компонент пути, связанный с каталогом.
Утилита, используемая для извлечения базового имени из пути к файлу или каталогу, эффективно удаляя все ведущие компоненты каталога и необязательные суффиксы. При предоставлении полного пути basename возвращает только имя файла или последний сегмент пути, что делает ее полезной в сценариях и задачах манипулирования файлами. Например, если указан путь /home/user/document.txt, базовое имя вернёт document.txt. Кроме того, пользователи могут указать суффикс, который нужно удалить, например .txt, оставив только документ. Эта команда упрощает работу с именами файлов и путями в сценариях, повышая автоматизацию и оптимизируя различные процессы управления файлами.
В этом руководстве мы расскажем об основах ‘basename’ на понятных примерах. Но прежде чем мы перейдем к этому, стоит отметить, что все приведенные здесь примеры были протестированы на машине Ubuntu 24.04 LTS.
Объяснение команды basename в Linux
Команда basename позволяет удалять из имен файлов компоненты, которые не требуются. Ниже приведен синтаксис этого инструмента:
basename NAME [SUFFIX] basename OPTION... NAME...
А вот что об этом говорится на странице man:
basename - strip directory and suffix from filenames
Print NAME with any leading directory components removed. If specified, also remove a trailing
SUFFIX.
Ниже приведено несколько примеров в стиле Q&A, которые должны дать вам представление о том, как работает команда basename.
Q1. Как работает команда basename?
По умолчанию, если вы выполняете команду ‘basename’ с полным путем к файлу в качестве входных данных, команда возвращает имя файла в выходных данных. Например, когда я выполнил следующую команду:
basename /home/himanshu/Downloads/analytics.pdf
я получил следующий результат:
analytics.pdf
Q2. Может ли basename обрабатывать несколько входов?
Да, может. Но для этого необходимо использовать параметр командной строки -a. Например, когда я выполнил следующую команду:
basename -a /home/himanshu/Downloads/analytics.pdf /home/himanshu/Pictures/test.png
И вот какой результат я получил:
analytics.pdf test.png
Q3. Как сделать так, чтобы расширение файла также отображалось в basename?
Иногда требуется получить только имя файла, но не его расширение. Это можно сделать с помощью параметра командной строки -s (который требует передачи суффикса в качестве входных данных).
Например, следующая команда:
basename -s .pdf /home/himanshu/Downloads/analytics.pdf
выдает следующее сообщение:
analytics
Q4. Как сделать так, чтобы вывод каждой строки заканчивался NUL?
По умолчанию в качестве разделителя при выводе используется символ новой строки. Однако при желании вы можете заставить basename использовать NUL в качестве разделителя. Это можно сделать с помощью опции командной строки -z.
Например:
basename -az /home/himanshu/Downloads/analytics.pdf /home/himanshu/Pictures/test.png
И вот результат:
analytics.pdftest.png
Таким образом, вы не видите здесь символа NUL. Вам нужно перенаправить вывод в файл, а затем открыть этот файл в редакторе, например vim. Вот что показал vim: