내 파일 이름의 확장자는 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