Bash에서 파일 이름 및 확장자 추출

bash string filenames


파일 이름 (확장자 없음)과 확장명을 별도로 가져오고 싶습니다.

지금까지 찾은 최고의 솔루션은 다음과 같습니다.

NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`

파일 이름에 여러 개가 포함되어 있으면 작동하지 않기 때문에 잘못되었습니다 . 문자. ,의 말을 할 수 있다면, 내가 가진 a.b.js , 그것은 고려합니다 및 b.js 을 대신, a.bjs . a

파이썬에서 쉽게 할 수 있습니다.

file, ext = os.path.splitext(path)

하지만 가능한 경우 파이썬 인터프리터를 실행하지 않는 것이 좋습니다.

더 좋은 아이디어가 있습니까?




Answer 1 Petesh


먼저 경로없이 파일 이름을 가져옵니다.

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

또는 '.'대신 경로의 마지막 '/'에 초점을 맞출 수 있습니다. 예기치 않은 파일 확장자가 있어도 작동합니다.

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

설명서를 확인하고 싶을 수도 있습니다.




Answer 2 Juliano


~% FILE="example.tar.gz"

~% echo "${FILE%%.*}"
example

~% echo "${FILE%.*}"
example.tar

~% echo "${FILE#*.}"
tar.gz

~% echo "${FILE##*.}"
gz

자세한 내용 은 Bash 매뉴얼의 쉘 매개 변수 확장 을 참조하십시오 .




Answer 3 Tomi Po


일반적으로 이미 확장명을 알고 있으므로 다음을 사용하려고 할 수 있습니다.

basename filename .extension

예를 들면 다음과 같습니다.

basename /path/to/dir/filename.txt .txt

그리고 우리는 얻는다

filename



Answer 4 sotapme


POSIX 매개 변수 확장의 마법을 사용할 수 있습니다.

bash-3.2$ FILENAME=somefile.tar.gz
bash-3.2$ echo "${FILENAME%%.*}"
somefile
bash-3.2$ echo "${FILENAME%.*}"
somefile.tar

파일 이름이 ./somefile.tar.gz 형식 인 경우 echo ${FILENAME%%.*} 가 탐욕스럽게 가장 긴 일치 항목을 제거 한다는 점에주의해야 합니다 . 빈 문자열이 있습니다.

임시 변수를 사용하여 해결할 수 있습니다.

FULL_FILENAME=$FILENAME
FILENAME=${FULL_FILENAME##*/}
echo ${FILENAME%%.*}

)


사이트 는 더 많은 것을 설명합니다.

${variable%pattern}
  Trim the shortest match from the end
${variable##pattern}
  Trim the longest match from the beginning
${variable%%pattern}
  Trim the longest match from the end
${variable#pattern}
  Trim the shortest match from the beginning



Answer 5 Doctor J


파일에 확장자가 없거나 파일 이름이 없으면 작동하지 않는 것 같습니다. 여기 내가 사용하는 것이 있습니다. 그것은 단지 내장을 사용하고 더 많은 (전부는 아님) 병적 인 파일 이름을 처리합니다.

#!/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  = ""