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


10

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

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

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


Ответы:


27

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

a=${1%.*}

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


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

2
${1%.*}вернется Something.eng. Если вы хотите убрать все справа от первого, .включая ., используйте ${1%%.*}, который вернется Something.
garyjohn


0

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

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.