파일 이름 (확장자 없음)과 확장명을 별도로 가져오고 싶습니다.
지금까지 찾은 최고의 솔루션은 다음과 같습니다.
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
파일 이름에 여러 .
문자 가 포함되어 있으면 작동하지 않기 때문에 잘못되었습니다 . ,의 내가이 말을 할 수 있다면 a.b.js
, 그것은 고려할 것입니다 a
및 b.js
대신 a.b
하고 js
.
파이썬에서 쉽게 할 수 있습니다.
file, ext = os.path.splitext(path)
하지만 가능한 경우 파이썬 인터프리터를 실행하지 않는 것이 좋습니다.
더 좋은 아이디어가 있습니까?
답변
먼저 경로없이 파일 이름을 가져옵니다.
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
또는 ‘.’대신 경로의 마지막 ‘/’에 초점을 맞출 수 있습니다. 예기치 않은 파일 확장자가 있어도 작동합니다.
filename="${fullfile##*/}"
설명서를 확인하고 싶을 수도 있습니다.
- 웹에서 ” 3.5.3 쉘 매개 변수 확장 ” 섹션
- “매개 변수 확장”이라는 섹션의 bash 맨 페이지에서
답변
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
자세한 내용 은 Bash 매뉴얼의 쉘 매개 변수 확장 을 참조하십시오 .
답변
일반적으로 이미 확장명을 알고 있으므로 다음을 사용하려고 할 수 있습니다.
basename filename .extension
예를 들면 다음과 같습니다.
basename /path/to/dir/filename.txt .txt
그리고 우리는 얻는다
filename
답변
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
답변
파일에 확장자가 없거나 파일 이름이 없으면 작동하지 않는 것 같습니다. 여기 내가 사용하는 것이 있습니다. 그것은 단지 내장을 사용하고 더 많은 (전부는 아님) 병적 인 파일 이름을 처리합니다.
#!/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 = "/" 기본 = "" ext = "" / home / me / : dir = "/ home / me /" 기본 = "" ext = "" / home / me / 파일 : dir = "/ home / me /" 기본 = "파일" ext = "" /home/me/file.tar : dir = "/ home / me /" 기본 = "파일" ext = "tar" /home/me/file.tar.gz : dir = "/ home / me /" base = "file.tar" ext = "gz" /home/me/.hidden : dir = "/ home / me /" 기본 = ".hidden" ext = "" /home/me/.hidden.tar : dir = "/ home / me /" 기본 = ".hidden" ext = "tar" / home / me / .. : dir = "/ home / me /" 기본 = ".." ext = "" . : dir = "" 기본 = "." ext = ""
답변
사용할 수 있습니다 basename
.
예:
$ basename foo-bar.tar.gz .tar.gz
foo-bar
당신은 당신이 항상 실행되어 그러나 경우, 제거되어야한다 확장자베이스 이름을 제공해야합니까 tar
함께 -z
다음 확장 될 것이다라는 것을 알고있다 .tar.gz
.
이것은 당신이 원하는 것을해야합니다 :
tar -zxvf $1
cd $(basename $1 .tar.gz)
답변
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
은 "."
문자 다음에 "."
줄 끝까지의 문자 이외의 숫자 를 아무 것도없이 바꿉니다 (즉, "."
줄 끝에서 끝까지 모든 것을 제거 합니다). 이것은 기본적으로 정규식 속임수를 사용하는 욕심없는 대체입니다.
for 명령 은 줄 시작 부분 EXTENSION
에 문자가 뒤 따르는 임의의 수의 문자 를 대체합니다 "."
(즉, 줄 시작에서 마지막 점까지 포함하여 모든 항목을 제거함). 이것은 기본 조치 인 탐욕스러운 대체입니다.