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

Вы можете проверить свойство .length объекта jQuery. Например:

if($("#two").length > 0) { // exists...

} else { // doesn't exist

}
1876
задан Benjamin W. 10 July 2018 в 15:04
поделиться

7 ответов

Сначала получите имя файла без пути:

filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"

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

filename="${fullfile##*/}"

Вы можете проверить документацию:

3304
ответ дан 22 November 2019 в 20:02
поделиться
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz

Подробнее см. Расширение параметров оболочки в руководстве по Bash.

583
ответ дан Peter Mortensen 10 July 2018 в 15:04
поделиться

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

$ echo "foo.tar.gz"|rev|cut -d"." -f3-|rev
foo
6
ответ дан Joydip Datta 10 July 2018 в 15:04
поделиться
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js

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

pax> FILE=a.b.js
pax> NAME=$(echo "$FILE" | sed 's/\.[^.]*$//')
pax> EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
pax> echo $NAME
a.b
pax> echo $EXTENSION
js

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

Команда для NAME заменяет ] "." символ, за которым следует любое количество символов, отличных от "." , до конца строки, ни с чем (т. Е. Удаляет все из конечного "." до конца строки включительно). По сути, это не жадная подстановка с использованием обмана регулярных выражений.

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

32
ответ дан 22 November 2019 в 20:02
поделиться

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

#!/bin/bash
for fullpath in "$@"
do
    filename="${fullpath##*/}"                      # Strip longest match of */ from start
    dir="${fullpath:0:${#fullpath} - ${#filename}}" # Substring from 0 thru pos of filename
    base="${filename%.[^.]*}"                       # Strip shortest match of . plus at least one non-dot char from end
    ext="${filename:${#base} + 1}"                  # Substring from len of base thru end
    if [[ -z "$base" && -n "$ext" ]]; then          # If we have an extension and no base, it's really the base
        base=".$ext"
        ext=""
    fi

    echo -e "$fullpath:\n\tdir  = \"$dir\"\n\tbase = \"$base\"\n\text  = \"$ext\""
done

А вот несколько тестов:

$ basename-and-extension.sh / /home/me/ /home/me/file /home/me/file.tar /home/me/file.tar.gz /home/me/.hidden /home/me/.hidden.tar /home/me/.. .
/:
    dir  = "/"
    base = ""
    ext  = ""
/home/me/:
    dir  = "/home/me/"
    base = ""
    ext  = ""
/home/me/file:
    dir  = "/home/me/"
    base = "file"
    ext  = ""
/home/me/file.tar:
    dir  = "/home/me/"
    base = "file"
    ext  = "tar"
/home/me/file.tar.gz:
    dir  = "/home/me/"
    base = "file.tar"
    ext  = "gz"
/home/me/.hidden:
    dir  = "/home/me/"
    base = ".hidden"
    ext  = ""
/home/me/.hidden.tar:
    dir  = "/home/me/"
    base = ".hidden"
    ext  = "tar"
/home/me/..:
    dir  = "/home/me/"
    base = ".."
    ext  = ""
.:
    dir  = ""
    base = "."
    ext  = ""
68
ответ дан 22 November 2019 в 20:02
поделиться

Просто используйте ${параметр%слово}

В вашем случае:

${FILE%.*}

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

FILE=abc.xyz; echo ${FILE%.*};
FILE=123.abc.xyz; echo ${FILE%.*};
FILE=abc; echo ${FILE%.*};
4
ответ дан 22 November 2019 в 20:02
поделиться

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

Используя Bash, есть также $ {file%. *} для получения имени файла без расширения и $ {file ## *.} , чтобы получить расширение самостоятельно. То есть

file="thisfile.txt"
echo "filename: ${file%.*}"
echo "extension: ${file##*.}"

Выводит:

filename: thisfile
extension: txt
28
ответ дан 22 November 2019 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: