문자열에서 모든 파일 확장자를 제거하는 방법은 무엇입니까?

문자열에서 모든 파일 확장자를 제거하는 방법은 무엇입니까?

내 파일 이름의 확장자는 MP4이지만 다음으로 끝나지 않습니다 _special.MP4.

mylist=$(ls | grep -v "_special.MP4")

.MP4그런 다음 후속 목록에서 확장명을 제거하고 싶습니다 .

echo $mylist | sed -e 's/\.MP4$//'

마지막 .MP4항목만 제거합니다. 어떻게 얻을 수 있나요?

답변1

.MP4로 끝나는 다음 파일이 있다고 가정해 보겠습니다.

.
├── 1.MP4
├── 2.MP4
└── 3_special.MP4

내가 올바르게 이해했다면 .MP4 확장자를 뺀 비특수 파일 이름이 필요합니다.

첫째, 출력을 제어하고 구문 분석하기가 더 쉽기 때문에 find대신 사용하겠습니다 . ls어느 쪽이든 개행으로 구분된 파일 목록이 생성됩니다.

$ find . -name '*.MP4' -not -name '*_special.MP4'
./1.MP4
./2.MP4

$패턴의 바인딩이 각 줄의 끝에 있으므로 sed 명령은 그대로 작동합니다 .

$ find . -name '*.MP4' -not -name '*_special.MP4' | sed -e 's/\.MP4$//'
./1
./2

이것basename이 명령은 실제로 대부분의 작업을 수행할 필요도 없습니다 sed. 주요 용도 basename는 경로 앞의 디렉터리를 제거하는 것이지만 접미사 제거도 지원합니다.

요약

기본 이름 문자열 [접미사]

basename"문자열" 위치에 있는 단일 단어만 허용되므로 각 파일에 대해 xargs를 한 번씩 실행해야 합니다.

$ find . -name '*.MP4' -not -name '*_special.MP4' | xargs -I -name- basename -name- .MP4
1
2

답변2

배시 사용:

shopt -s extglob            # enable extglob
mylist=( !(*_special.MP4) ) # fill array but without files with suffix _special.MP4
echo "${mylist[@]%.MP4}"    # remove suffix .MP4

관련 정보