파일 이름에 키워드가 없는 모든 파일 삭제

파일 이름에 키워드가 없는 모든 파일 삭제

다음과 같은 방법으로 파일 목록이 있습니다.

> file1.jpg 
> file1_orig.jpg 
> file2.jpg 
> file2_orig.jpg

확장자가 _orig.jpg인 모든 파일을 유지하고 확장자가 없는 파일은 삭제하고 싶습니다. Bash를 사용하여 어떻게 이를 달성할 수 있나요?

답변1

Bash를 사용할 수 있습니다확장자 파일 이름 확장자:

rm !(*_orig.jpg)

문법 !(pattern):

주어진 패턴 중 하나를 제외한 모든 것과 일치합니다.

따라서 이는 일치하지 않는 모든 파일 이름으로 확장되며 *_orig.jpg삭제할 수 있습니다(또는 방해가 되지 않는 위치로 이동할 수 있음). 이 옵션을 활성화 해야 합니다 extglob.shopt -s extglob(그렇지 않으면 "이벤트를 찾을 수 없음" 형식의 오류가 발생합니다) 그러나 일반적으로 기본적으로 활성화되어 있습니다.


또는 임시로 보관하려는 파일만 이동하고 나머지는 삭제할 수 있습니다.

mkdir tmp
mv *_orig.jpg tmp
rm *.jpg
mv tmp/*.jpg .
rmdir tmp

사용하는 옵션이 있습니다find게다가:

find . -type f ! -name '*_orig.jpg' -exec rm '{}' +

이는 현재 디렉토리에서 이름이 지정되지 않은(일반) 파일을 재귀적으로 찾아 *_orig.jpg삭제합니다. 파일이 모두 하나의 디렉토리에 직접 있지 않은 경우 이것이 최선의 옵션입니다.

답변2

POSIX 방식:

$ find . \( ! -name . -prune -a -name "*.jpg" -a ! -name "*_orig.jpg" \) -exec rm -- {} +

관련 정보