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

10

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

a="${1:0:-4}"

Но мне нужно иметь возможность работать с расширениями, которые имеют более трех символов, как %~n1в Windows.
Есть ли способ извлечь имя файла без расширения из аргументов?

user304822
источник
stackoverflow.com/questions/2664740/…
sancho.s ReinstateMonicaCellio

Ответы:

27

Обычный способ сделать это в bash - использовать расширение параметров. (См. Справочную страницу bash и найдите «Расширение параметров».)

a=${1%.*}

%Указывает на то, что все соответствующие шаблону (следующий .*) справа, используя самый короткий матч возможно, должен быть удален из параметра $1. В этом случае вам не нужны двойные кавычки (") вокруг выражения.

garyjohn
источник
1
Шаблоны файлов обычно выглядят так: «Something.eng.ext». Очевидно, что в этом случае ext является расширением, но использование $ {1%. *} Вернет только часть «Something», верно?
user304822
2
${1%.*}вернется Something.eng. Если вы хотите убрать все справа от первого, .включая ., используйте ${1%%.*}, который вернется Something.
garyjohn
13

Если вы знаете расширение, вы можете использовать базовое имя

$ basename /home/jsmith/base.wiki .wiki
base
Стивен Пенни
источник
0

Однострочник в Bash без использования базового имени :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
LuckyDams
источник