Имя файла Bash без расширения

Обновлено: 03.07.2024

В этом учебном пособии обсуждается метод вырезания и отображения определенных полей файла с помощью сценария bash с помощью команды cut и команд bash с базовым именем. Мы также увидим его использование в сочетании с трубами. Затем мы увидим некоторые проблемы, которые потенциально могут возникнуть при вырезании расширений из имен файлов.

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

Используйте метод cut для удаления расширения файла в Bash

  • -b (Bytes): этот параметр обрезает части текста во всех строках после определенного количества байтов.
  • -c (столбец): используется для вырезания определенных столбцов или диапазона столбцов из файла и отображения остатка на консоли.
  • -f (поле): совокупность символов между двумя символами-разделителями (кроме первого) называется полем. Для каждой строки в файле -f отображает только поля или части строки, упомянутые с помощью целых номеров полей. Табуляция считается разделителем по умолчанию. Однако мы можем использовать флаг -d для определения любого определяемого пользователем символа-разделителя. Описание команды cut с параметрами -f и d приведено ниже.

Доступны и другие параметры, такие как -complement , -output-delimiter и -version . Вы можете получить помощь, используя команду cut --help для получения дополнительной информации.

Пример 1. Удаление расширений из контента

Рассмотрите следующий пример, чтобы узнать больше о -f и -d . Предположим, что файл webpages.txt содержит имена различных веб-страниц HTML для определенного веб-сайта, каждая в новой строке. Посмотрим на содержимое webpages.txt, выполнив в терминале команду cat: -

Следующий сценарий bash удалит расширения из всех имен файлов в файле webpages.txt и отобразит вывод на стандартной консоли. Предположим, мы создали файл сценария оболочки с именем script и записали в него следующий код: -

Здесь 1 перед -f используется для сохранения только первого поля и . в параметрах -d указывает, что поля должны быть разделены с помощью . символ. Таким образом, скрипт сохраняет весь текст в каждой строке webpages.txt до первого файла . сталкиваться. Давайте посмотрим на результат.

Здесь, если мы установим номер поля равным 2 , только второе поле (т. е. HTML) будет напечатано на экране для каждой строки.

Пример 2. Удаление расширения из имени файла, хранящегося в переменной, с помощью канала и отображение его на консоли

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

Приведенный выше код передает имя файла, хранящееся в переменной file, команде cut, которая сохраняет только первое поле текста.

Пример 3. Удаление расширения из имени файла, хранящегося в переменной, с помощью канала и присвоение его другой переменной

Приведенный выше код использует метод подстановки команд для замены вывода команды на место команды. Таким образом, trimmed назначается независимо от того, что выводит правая часть присваивания.

Проблемы при удалении расширения файла в Bash

Если имя файла содержит сам символ-разделитель в имени файла, то приведенная выше формулировка вернет текст только до первого появления символа-разделителя. Мы можем решить эту проблему, реверсивно урезав имя.

Давайте посмотрим на следующий код.

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

Решение. Мы можем отменить содержимое файла, прежде чем передать его команде cut. После этого команда вырезания сохранит все поля, кроме первого из перевернутого текста. Теперь его нужно перевернуть, чтобы получить окончательный ответ.

Обратите внимание на изменение значения параметра f. Опция -f 2- используется для сохранения всех полей со значением позиции два или больше.

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

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

Первый аргумент командной строки команды basename — это имя переменной, а имя расширения — второй аргумент. Команда basename просматривает текст и печатает все до первого появления имени расширения (в нашем случае .html).

Статьи DelftStack написаны такими же фанатами программного обеспечения, как и вы. Если вы также хотите внести свой вклад в DelftStack, написав платные статьи, вы можете посетить страницу «Написать для нас».

Статья по теме — Bash-файл


сообщить об этом объявлении

Пользователям Linux необходимо регулярно работать с файлами по разным причинам.Иногда пользователям нужно прочитать базовое имя файла, только удалив расширение файла. Имя файла и расширение могут быть разделены и сохранены в разных переменных в Linux несколькими способами. Для удаления расширения файла можно использовать встроенную команду Bash и расширение параметра оболочки. В этом руководстве объясняется, как можно прочитать имя файла без расширения с помощью упомянутых выше способов.

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

Команда `basename` используется для чтения имени файла без расширения из каталога или пути к файлу.

Синтаксис:

Здесь ИМЯ может содержать имя файла или имя файла с полным путем. SUFFIX является необязательным и содержит часть расширения файла, которую пользователь хочет удалить. Команда `basename` имеет несколько опций, описанных ниже.

Параметры

< td width="135">-s
Имя Описание
-a Используется для передачи нескольких имен файлов с путем или без пути в качестве аргументов команды.
Используется для передачи расширения как суффикса, который необходимо удалить.
-z Используется для отображения нескольких имен файлов, разделяя каждый файл нулем.
–help Используется для отображения информации об использовании команды `basename`.
– version Используется для отображения информации о версии.

Пример 1: использование NAME и SUFFIX

Следующая команда `basename` извлечет имя файла с расширением. СУФФИКС в этой команде опущен. Здесь выводится файл «product.txt».

Если вы хотите получить имя файла без расширения, вам необходимо указать расширение файла как SUFFIX с помощью команды `basename`. Здесь расширение «.txt». Выполните следующую команду, чтобы удалить расширение из файла.


Пример 2: Использование параметра «-a» и ИМЯ

В этом примере показано использование параметра «-a» команды «basename». Здесь два пути к файлам передаются в качестве аргументов с помощью команды `basename`. Каждое имя файла с расширением будет извлечено из пути и напечатано с новой строкой.


Пример 3: Использование опции ‘-z’ и ИМЯ

Опция ‘-z’ используется с командой `basename` для печати нескольких имен файлов с нулевым значением вместо новой строки. В следующей команде используются два параметра вместе: «-a» и «-z». Здесь два имени файла, index.html и emp.txt, будут напечатаны без пробелов и новой строки.


Пример 4: Использование опции ‘-s’ и ИМЯ

Следующую команду можно использовать вместо SUFFIX с `basename`. Расширение файла необходимо передать с параметром «-sh», чтобы удалить расширение файла из файла. В следующем примере будет удалено расширение «-sh» из файла «addition.sh».


Пример 5: Удалить расширение файла без SUFFIX

Если вы не знаете расширения файла, который хотите удалить из имени файла, то этот пример поможет вам решить проблему. Создайте файл с именем read_file.sh со следующим кодом, чтобы получить имя файла с любым расширением. Команда `sed` используется в этом примере для удаления любого типа расширения из имени файла. Если вы запустите скрипт, вывод будет «средним» после удаления расширения «py».

read_file.sh


Пример 6. Преобразование расширения файла из txt в docx

Имя файла без расширения необходимо для преобразования файла из одного расширения в другое. В этом примере показано, как вы можете изменить расширение всех текстовых файлов (.txt) на текстовые файлы (.docx) с помощью команды `basename` в сценарии bash. Создайте файл с именем convert_file.sh со следующим кодом. Здесь цикл for-in используется для чтения всех текстовых файлов с расширением «.txt» из текущего каталога. Имя файла без расширения читается командой `basename` и переименовывается путем добавления расширения «.docx» в каждой итерации цикла.

convert_file.sh

Проверьте, конвертированы текстовые файлы или нет, с помощью команды `ls`.


Пример 7: Чтение имени файла без расширения с использованием расширения параметра Shell

Расширение параметра оболочки — это еще один способ прочитать имя файла без расширения в bash.В этом примере показано использование расширения параметров оболочки. Следующая команда сохранит путь к файлу в переменной $filename.

Следующая команда удалит все типы расширений из пути и сохранит путь к файлу без расширения в переменной $file1.

Следующая команда напечатает имя файла только из пути. Здесь вывод будет «мой файл».

Если имя файла содержит два расширения с двумя точками (.), и вы хотите прочитать имя файла, удалив последнее расширение файла, вам необходимо использовать следующую команду. Выполните следующую команду, которая сохранит путь к файлу в переменной $file2, удалив последнее расширение файла.

Теперь выполните следующую команду, чтобы напечатать имя файла с расширением в одну точку (.). Здесь вывод будет «myfile.tar».

Заключение

Имя файла без расширения требуется для различных целей. Некоторые случаи использования имени файла без расширения объясняются в этом руководстве с помощью некоторых примеров, таких как преобразование файлов. Этот учебник поможет тем пользователям, которые заинтересованы, узнать, как отделить имя файла и расширение от пути к файлу. Здесь объясняются два способа. Пользователь может использовать любой из этих способов для извлечения имени файла только из пути к файлу.

Об авторе

Фахмида Есмин

Я веду курсы веб-программирования. Мне нравится писать статьи или учебные пособия на различные темы в области ИТ. У меня есть канал на YouTube, на котором публикуются различные учебные пособия по Ubuntu, Windows, Word, Excel, WordPress, Magento, Laravel и т. д.: Справка Tutorials4u.

Как получить расширение файла из bash? Вот что я пробовал:

Сделав это, я могу получить расширение bz2 из пути /dir/subdir/file.bz2 , но у меня проблема с путем /dir/subdir/file-1.0.tar.bz2 .

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

Чтобы прояснить свой вопрос, я создал сценарий bash для извлечения любого заданного архива с помощью одной команды extract path_to_file . Способ извлечения файла определяется сценарием, видя его тип сжатия или архивирования, который может быть .tar.gz, .gz, .bz2 и т. д. Я думаю, что это должно включать манипуляции со строками, например, если я получаю расширение .gz затем я должен проверить, есть ли строка .tar перед .gz — если да, то расширение должно быть .tar.gz .


8 ответов 8

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

Если имя файла — file-1.0.tar.bz2, расширение — bz2. Метод, который вы используете для извлечения расширения ( fileext=$ ), абсолютно корректен¹.

Как вы решаете, что расширение должно быть tar.bz2, а не bz2 или 0.tar.bz2? Вам нужно сначала ответить на этот вопрос. Затем вы сможете выяснить, какая команда оболочки соответствует вашей спецификации.

Одним из возможных уточнений является то, что расширения должны начинаться с буквы. Эта эвристика не работает для нескольких распространенных расширений, таких как 7z , которые лучше рассматривать как частный случай. Вот реализация bash/ksh/zsh:

Для переносимости POSIX необходимо использовать оператор case для сопоставления с образцом.

Еще одна возможная спецификация заключается в том, что некоторые расширения обозначают кодировки и указывают на необходимость дальнейшего удаления. Вот реализация bash/ksh/zsh (требуется shopt -s extglob в bash и setopt ksh_glob в zsh):

Обратите внимание, что при этом 0 считается расширением файла file-1.0.gz .

¹ $ и связанные с ним конструкции находятся в POSIX, поэтому они работают в любой неустаревшей оболочке в стиле Борна, такой как ash, bash, ksh или zsh.

Получение имени файла с полным путем без расширения

Информационный аватар участника

5, 0

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

выполнение приведенного ниже скрипта приводит к ошибке в операторе DIR = `dirname $FILE` --команда не найдена.

Тестировщик

Информационный аватар участника

12 296, 3 792

Информационный аватар участника

5, 0

Информационный аватар участника

3 149 702 

Еще 10 обсуждений, которые могут вас заинтересовать

1. Программирование оболочки и создание сценариев

[BASH] Получение имени файла и его расширения

Обсуждение начато: море

2. Программирование оболочки и создание сценариев

Получить последнее имя файла без расширения

Мне нужно написать сценарий оболочки для отображения вывода команды ls следующим образом: ls -ltr *txt Я получаю это -rw-r----- 1 oracle dba 51912704 11 декабря 10:27 /usr/local/ sam/test12112012101247AM.txt -rw-r--r-- 1 oracle dba 7 11 декабря 11:58 /usr/local/sam/test.txt но мне просто нужна последняя версия. (7 ответов)

Обсуждение начато: sumang24

3. UNIX для чайников, вопросы и ответы

ABCD_EFGH.0.100.40 A_WORD="ABCD_EFGH.0.50.3" NEW_WORD=remove_last_ext("A_WORD") NEW_WORD --> ABCD_EFGH.0.50 A_WORD="ABCD_EFGH.3.100.50." . " style="color:Navy;">BASH — Удаление самого последнего символа(ов) расширения имени файла

Здравствуйте. Я хотел бы знать, как это сделать в сценарии bash: A_WORD="ABCD_EFGH.0.100.40.123" NEW_WORD=remove_last_ext("A_WORD") NEW_WORD --> ABCD_EFGH.0.100.40 A_WORD="ABCD_EFGH.0.50.3" NEW_WORD= remove_last_ext("A_WORD") NEW_WORD --> ABCD_EFGH.0.50 A_WORD="ABCD_EFGH.3.100.50." . (2 ответа)

Обсуждение начато: jcdole

4. Программирование оболочки и создание сценариев

Скрипт для добавления расширения к имени файла

Привет всем, у меня есть папка с кучей файлов, и я хотел бы добавить расширение (.mp3) ко всем этим именам файлов. В папке есть только файлы, к которым я хотел бы добавить .mp3. Это выглядит примерно так: Ввод: Файл1 Файл2 Файл3Вывод: Файл1.mp3 Файл2.mp3 Файл3.mp3Спасибо. (2 ответа)

Читайте также: