Linux basename без расширения

Linux команда basename для начинающих (с примерами)

Иногда, работая в командной строке (особенно при работе с shell-скриптами), вам может быть интересно только имя файла, но доступным для вас является полный путь к файлу.

Таким образом, необходимо разбить компонент каталога пути.

Вы будете рады узнать, что существует команда – basename – которая выполняет эту работу.

В этом уроке мы обсудим основы «basename», используя несколько простых для понимания примеров.

Но прежде чем мы перейдем к этому, стоит упомянуть, что все примеры здесь были протестированы на машине Ubuntu 16.04 LTS.

Команда basename для Linux

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

Ниже приведен синтаксис инструмента:

И вот что man говорит:

Ниже приведены примеры Вопрос & Ответ, которые должны дать вам представление о том, как работает команда basename.

Вопрос 1. Как работает команда basename?

По умолчанию, если вы запустите команду «basename» с полным путем к файлу в качестве ввода, команда возвращает имя файла на выводе.

Например, когда я выполнил следующую команду:

Я получил следующий результат:

Вопрос 2. Может ли basename обрабатывать несколько вводов?

Но для этого вам нужно использовать опцию -a командной строки.

Например, когда я выполнил следующую команду:

я получил вывод:

Вопрос 3. Как убрать расширение файла ?

Иногда вы можете захотеть получить имя файла, но не его расширение

это можно сделать, используя опцию командной строки -s (которая требует, чтобы вы передавали суффикс в качестве ввода).

Например, следующая команда:

произвела этот результат:

Вопрос 4. Как сделать вывод каждой строки с помощью NUL?

По умолчанию символ новой строки используется как разделитель на выходе.

Однако, если вы хотите, вы можете заставить basename использовать NUL в качестве разделителя.

Это можно сделать, используя опцию командной строки -z.

Источник

Команда Basename в Linux

basename — это утилита командной строки, которая удаляет каталог и конечный суффикс из заданных имен файлов.

Использование команды basename

Команда basename поддерживает два формата синтаксиса:

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

Самый простой пример — вывести имя файла с удаленными ведущими каталогами:

Вывод будет включать имя файла:

Команда basename удаляет любые завершающие символы / :

Обе команды выдадут одинаковый результат:

По умолчанию каждая строка вывода заканчивается символом новой строки. Чтобы завершить строки NUL , используйте параметр -z ( —zero ).

Несколько входов

Команда basename может принимать несколько имен в качестве аргументов. Для этого вызовите команду с параметром -a ( —multiple ), за которым следует список файлов, разделенных пробелом.

Например, чтобы получить имена файлов /etc/passwd и /etc/shadow вы должны запустить:

Удаление конечного суффикса

Чтобы удалить любой конечный суффикс из имени файла, передайте суффикс в качестве второго аргумента:

Обычно эта функция используется для удаления расширений файлов:

Читайте также:  Делаем загрузочный диск windows

Другой способ удалить конечный суффикс — указать суффикс с параметром -s ( —suffix=SUFFIX ):

Эта форма синтаксиса позволяет удалить любой конечный суффикс из нескольких имен:

пример

В следующем примере показано, как использовать команду basename внутри цикла bash for для переименования всех файлов, заканчивающихся на «.jpeg» в текущем каталоге, путем замены расширения файла с «.jpeg» на «.jpg»:

Если вы используете bash в качестве оболочки, вместо вызова basename вы можете использовать удаление конечного расширения с помощью расширения параметров оболочки .

Выводы

Команда basename удаляет любой начальный каталог и конечный суффикс из имени.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Использование команды Basename в Bash Scripts

Главное меню » Операционная система Linux » Использование команды Basename в Bash Scripts

Позвольте нам показать вам несколько примеров.

Команда Basename

Команда basename имеет два вида синтаксиса. Первый включает суффикс :

Второй позволяет добавить опции:

Вы не можете комбинировать опции с суффиксом. Только не смущайтесь. Следуйте примерам, и тогда вы поймете, что мы хотим сказать.

Использование команды basename с путем к файлу даст имя файла:

Команда basename довольно простая на самом деле. Она действительно не распознает путь к файлу. Она просто ищет косые черты (/) и печатает все, что находится после последней косой черты.

Например, если мы запустим приведенный выше пример, удалив имя файла, вот что это даст.

Удаление расширения файла с суффиксом

Основное использование команды bash заключается в извлечении имени файла из пути к файлу. Вы также можете удалить расширение файла при извлечении имени файла.

Просто упомяните, что вы хотите удалить в конце вывода. Допустим, вы хотите удалить .txt из filename.txt. Просто добавьте его в конец команды basename:

Вы также можете использовать опцию -s для расширения:

Расширение удаляется с конца последнего компонента ввода. Команда на самом деле не выясняет расширение файла. Если вы укажите txt (без точки) вместо .txt, вы получите «имя файла». (с точкой в конце).

Кроме того, если вы предоставите расширение, которое не находится в конце компонента, вывод останется таким, как если бы расшщирения не было.

Использование базового имени с несколькими путями

С помощью опции -a вы можете использовать несколько путей одновременно.

Вы можете использовать опцию суффикса -sс, -a, но с некоторыми ограничениями. Вы можете указать только одно расширение для всех путей к файлам.

Вы также можете отделить вывод с помощью NULL вместо новой строки с опцией -z.

Использование базового имени в скрипте bash

Мы показали несколько примеров команды basename. Давайте посмотрим пару примеров basename в скриптах bash.

Предположим, у вас есть переменная пути к файлу, и вы хотите сохранить имя файла из пути в переменной. Это может быть простой скрипт:

Другой пример, где вы хотите переименовать расширения файлов. Конечно, вы можете использовать команду rename для пакетного переименования файлов, но это только пример.

Поэтому мы написали этот пример сценария с целью замены расширений файлов:

Вы заметили, что мы поставили галочку, если это файл или нет в скрипте bash, чтобы он не изменил соответствующий каталог?

Вы можете использовать приведенный выше скрипт следующим образом:

И он переименует все файлы в текущем каталоге с html в конце на htm.

Это было всего лишь несколько примеров. Вы можете использовать его в соответствии с вашими требованиями.

Команда basename дополняется командой dirname. В отличие от basename, команда dirname печатает весь путь, кроме последнего компонента.

Мы надеемся, вам понравилась эта статья. Как всегда, не стесняйтесь задавать вопросы или давать предложения в разделе комментариев.

Читайте также:  Lan configuration in windows

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Извлечь имя файла и расширение в Bash

Я хочу, чтобы получить имя файла (без расширения) и расширение отдельно.

лучшее решение я нашел до сих пор:

это неправильно, потому что он не работает, если имя файла содержит несколько . символы. Если, скажем, у меня есть a.b.js , он будет рассматривать a и b.js , вместо a.b и js .

это можно легко сделать в Python с

но я бы предпочел не запускать Python переводчик только для этого, если возможно.

30 ответов

во-первых, получить имя файла без пути:

кроме того, вы можете сосредоточиться на последнем » / «пути вместо». который должен работать даже если у вас есть непредсказуемо расширениями:

дополнительные сведения см. В разделе расширение параметров оболочки в руководстве Bash.

обычно вы уже знаете расширение, поэтому вы можете использовать:

вы можете использовать магию переменных POSIX:

в этом есть оговорка, если ваше имя файла было в форме ./somefile.tar.gz затем echo $ жадно удалил бы самую длинную спичку в . и у вас будет пустая строка.

(вы можете обойти это с помощью временной переменной:

этой сайт больше объясняет.

это не работает, если файл не имеет расширения или имени файла. Вот что я использую; он использует только встроенные имена и обрабатывает больше (но не все) патологические имена файлов.

и вот некоторые тестовые примеры:

вам нужно предоставить basename с расширением, которое должно быть удалено, однако, если вы всегда выполняете tar С -z тогда вы знаете, что расширение будет .tar.gz .

это должно делать то, что вы хотите:

отлично работает, поэтому вы можете просто использовать:

команды, кстати, работают следующим образом.

команда NAME заменяет a «.» символ, за которым следует любое число «.» символы до конца строки, без ничего (т. е. он удаляет все из final «.» до конца строки включительно). Это в основном не жадная подстановка с использованием обмана regex.

команда EXTENSION заменители a любое количество символов, за которыми следует «.» символ в начале строки, без ничего (т. е. он удаляет все от начала строки до конечной точки, включительно). Это жадная подстановка, которая является действием по умолчанию.

Меллен пишет в комментарии к сообщению в блоге:

используя Bash, есть также $ получить имя файла без расширения и $ чтобы получить расширение в одиночку. То есть,

можно использовать cut команда для удаления последних двух расширений ( «.tar.gz» часть):

как отметил Клейтон Хьюз в комментарии, это не будет работать на конкретном примере в вопросе. Поэтому в качестве альтернативы я предлагаю использовать sed с расширенными регулярными выражениями, например:

он работает, удаляя последние два (альфа-числовые) расширения безоговорочно.

[Обновлено снова после комментария от Андерса Линдаля]

нет необходимости беспокоиться с awk или sed или даже perl для этой простой задачи. Есть чистый-Баш, os.path.splitext() -совместимое решение, которое использует только разложений параметра.

Эталонной Реализации

разделить путь пути на пару (root, ext) такое, что root + ext == path и ext пусто или начинается с точки и содержит не более одного периода. Ведущие периоды базовое имя игнорируется; splitext(‘.cshrc’) возвращает (‘.cshrc’, ») .

Реализация Bash

почитание ведущих периодов

игнорирование ведущих периодов

тесты

вот тестовые примеры для игнорирование ведущих периодов реализация, которая должна соответствовать ссылочной реализации Python на каждом входе.

вот некоторые альтернативные предложения (в основном в awk ), включая некоторые расширенные варианты использования, такие как извлечение номеров версий для пакетов программного обеспечения.

все варианты использования, используя исходный полный путь в качестве входных данных, вне зависимости от промежуточных результатов.

[Пересмотрено с однострочного до общего bash функции поведение сейчас соответствует dirname и basename служебные программы; обоснование добавил.]

Читайте также:  Kmsnano для windows 10

на принято отвечать работает в типичный делам, а не в edge делам, а именно:

  • для имен файлов без расширения (называется суффикс в остальной части этот ответ), extension=$ возвращает входное имя файла, а не пустая строка.
  • extension=$ не включает начальное . , противоречит Конвенции.
    • слепо знаком . не будет работать для имен без суффикса.
  • filename=»$» будет пустая строка, если имя входного файла начинается с . и не содержит никаких новых . символы (например, .bash_profile ) — противоречит Конвенции.

таким образом, сложность робастное разрешение которое покрывает все случаи края требует функции — см. его определение ниже; это может возвратить все компоненты контура.

обратите внимание, что аргументы после входного пути свободно выбираются, позиционная переменная имена.
Пропустить переменные не из проценты, которые приходят перед теми, которые есть, укажите _ (использовать выбрасываемую переменную $_ ) или » ; например, чтобы извлечь только корень и расширение файла, используйте splitPath ‘/etc/bash.bashrc’ _ _ fnameroot extension .

тестовый код, который выполняет функции:

ожидаемый результат — обратите внимание на граничные случаи:

  • имя файла без суффикса
  • имя файла, начиная с . (не считается началом суффикс)
  • входной путь, заканчивающийся в / (символы / игнорируется)
  • входной путь, который является только имя файла ( . возвращается как родительский путь)
  • имя файла, которое имеет больше, чем . -маркер с префиксом (суффиксом считается только последний):

Источник

Извлечение имени файла без пути и расширения в bash [дубликат]

этот вопрос уже есть ответ здесь:

  • Извлечь имя файла и расширение в Bash 35 ответов

дали имена файлов, как это:

Я надеюсь получить:

почему это не сработает?

Как правильно это сделать?

9 ответов:

вы не должны вызывать внешний

на basename команда имеет два разных вызова; в одном вы указываете только путь, и в этом случае он дает вам последний компонент, а в другом вы также даете суффикс, который он удалит. Таким образом, вы можете упростить свой пример кода, используя второй вызов basename. Кроме того, будьте осторожны, чтобы правильно цитировать вещи:

комбинация basename и cut отлично работает, даже в случае двойного окончания, например .tar.gz :

было бы интересно, если это решение требует меньше арифметической мощности, чем расширение параметра Bash.

чисто bash , нет basename , без переменной жонглирования. Установите строку и echo :

Примечание: bash extglob опция должна быть «on», (on Ubuntu он «включен» по умолчанию), если это не так, сделайте:

  1. $ $s.
  2. // заменить каждый экземпляр узор.
  3. +( матч один или несколько на список шаблон в скобках.
  4. *\/ соответствует что-нибудь до / . (1-й образец)
  5. | или. (разделитель шаблонов.)
  6. .* соответствует что-нибудь после . . (2-й образец)
  7. ) конец список шаблон.
  8. > расширение конечного параметра — так как нет / (который будет предшествовать замене строки), совпадающие шаблоны удаляются.

соответствующей man bash справочная информация:

я нуждался в этом, так же, как просил bongbang и w4etwetewtwet.

вот еще один (более сложный) способ получения имени файла или расширения, сначала используйте rev команда инвертировать путь к файлу, вырезать из первого . а затем снова инвертировать путь к файлу, например:

Если вы хотите играть хорошо с пути к файлам Windows (под Cygwin) вы также можете попробовать это:

Это будет учитывать разделители обратной косой черты при использовании BaSH на Windows.

просто альтернатива, которую я придумал, чтобы извлечь расширение, используя сообщения в этой теме с моей собственной небольшой базой знаний, которая была мне более знакома.

Примечание: пожалуйста, сообщите о моем использовании кавычек; это сработало для меня, но я мог бы упустить что-то при их правильном использовании (я, вероятно, использую слишком много).

Источник

Оцените статью