В дополнение к соответствующему синтаксису POSIX , используемому в этом ответе ,
basename <i>string</i> [<i>suffix</i>]
как в
basename /foo/fizzbuzz.bar .bar
GNU basename
поддерживает другой синтаксис:
basename -s .bar /foo/fizzbuzz.bar
с тем же результатом. Разница и преимущество в том, что -s
подразумевает -a
, который поддерживает несколько аргументов:
$ basename -s .bar /foo/fizzbuzz.bar /baz/foobar.bar
fizzbuzz
foobar
Это даже можно сделать безопасным для имени файла, разделив вывод с помощью байтов NUL с помощью опции -z
, например, для этих файлов, содержащих пробелы, символы новой строки и символы глобуса (указаны ls
):
$ ls has*
'has'$'\n''newline.bar' 'has space.bar' 'has*.bar'
Чтение в массив:
$ readarray -d $'\0' arr < <(basename -zs .bar has*)
$ declare -p arr
declare -a arr=([0]=$'has\nnewline' [1]="has space" [2]="has*")
readarray -d
требуется Bash 4.4 или новее. Для более старых версий мы должны выполнить цикл:
while IFS= read -r -d '' fname; do arr+=("$fname"); done < <(basename -zs .bar has*)