다음과 같은 방법으로 파일 목록이 있습니다.
> 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 -- {} +