확장자가 있는 하나 또는 몇 개의 파일을 제외하고 디렉터리에서 모든 파일을 삭제하는 3가지 방법
때로는 디렉토리의 모든 파일을 삭제해야 하거나 특정 유형의 파일(특정 확장자로 끝나는 파일)을 제외한 모든 파일을 제거하여 디렉토리를 정리해야 하는 상황이 발생할 수 있습니다.
이 문서에서는 rm, find 및 globignore 명령을 사용하여 특정 파일 확장자 또는 유형을 제외한 디렉토리의 파일을 삭제하는 방법을 보여줍니다.
더 나아가기 전에 Linux의 중요한 개념 중 하나인 파일 이름 패턴 일치를 간략하게 살펴보겠습니다. 이를 통해 당면한 문제를 처리할 수 있습니다.
권장 읽기: Linux에서 find 명령을 사용하여 여러 파일 이름/확장명 검색
Linux에서 셸 패턴은 와일드카드 또는 메타문자라고 하는 다음과 같은 특수 문자로 구성된 문자열입니다.
*
– 0개 이상의 문자와 일치합니다.?
– 모든 단일 문자와 일치합니다.[seq]
– seq의 모든 문자와 일치합니다.[!seq]
– seq에 없는 모든 문자와 일치합니다.
여기에서 살펴볼 세 가지 가능한 방법이 있으며 여기에는 다음이 포함됩니다.
확장 패턴 일치 연산자를 사용하여 파일 삭제
다양한 확장 패턴 일치 연산자가 아래에 나열되어 있습니다. 여기서 pattern-list는 |
문자를 사용하여 구분된 하나 이상의 파일 이름을 포함하는 목록입니다.
*(pattern-list)
– 지정된 패턴이 0개 이상 일치합니다.?(pattern-list)
– 지정된 패턴이 0개 또는 1개 발생하는 것과 일치합니다.- +(pattern-list) – 지정된 패턴과 하나 이상 일치합니다.
@(pattern-list)
– 지정된 패턴 중 하나와 일치합니다.!(pattern-list)
– 주어진 패턴 중 하나를 제외한 모든 항목과 일치합니다.
이를 사용하려면 다음과 같이 extglob 셸 옵션을 활성화하세요.
shopt -s extglob
1. filename을 제외한 디렉토리의 모든 파일을 삭제하려면 아래 명령을 입력하십시오.
rm -v !("filename")
2. filename1 및 filename2을 제외한 모든 파일을 삭제하려면:
rm -v !("filename1"|"filename2")
3. 아래 예는 모든 .zip
파일을 제외한 모든 파일을 대화형으로 제거하는 방법을 보여줍니다.
rm -i !(*.zip)
4. 다음으로, 다음과 같이 모든 .zip
및 .odt
파일을 제외한 디렉토리의 모든 파일을 삭제하면서 현재 진행 중인 파일을 표시할 수 있습니다. 완료:
rm -v !(*.zip|*.odt)
필요한 명령이 모두 있으면 다음과 같이 extglob 셸 옵션을 끄세요.
shopt -u extglob
Linux find 명령을 사용하여 파일 삭제
이 방법에서는 아래 형식과 같이 파이프라인을 사용하여 적절한 옵션과 함께 find 명령을 단독으로 사용하거나 xargs 명령과 함께 사용할 수 있습니다.
find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}
5. 다음 명령은 현재 디렉터리에서 .gz
파일을 제외한 모든 파일을 삭제합니다.
find . -type f -not -name '*.gz'-delete
6. 파이프라인 및 xargs를 사용하여 위의 사례를 다음과 같이 수정할 수 있습니다.
find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}
7. 한 가지 추가 예를 살펴보겠습니다. 아래 명령은 .gz
, .odt
및 를 제외한 모든 파일을 지웁니다. .jpg
파일을 현재 디렉터리에 저장:
find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete
Bash GLOBIGNORE 변수를 사용하여 파일 삭제
그러나 이 마지막 접근 방식은 bash에서만 작동합니다. 여기서 GLOBIGNORE 변수는 경로 이름 확장에서 무시할 콜론으로 구분된 패턴 목록(파일 이름)을 저장합니다.
추천 자료: Linux의 Grep 명령에 대한 유용한 12가지 실제 예
이 방법을 사용하려면 정리하려는 디렉터리로 이동한 후 GLOBIGNORE 변수를 다음과 같이 설정하세요.
cd test
GLOBIGNORE=*.odt:*.iso:*.txt
이 경우 .odt
, .iso
및 .txt
파일을 제외한 모든 파일이 현재 디렉터리에서 제거됩니다.
이제 다음 명령을 실행하여 디렉터리를 정리합니다.
rm -v *
그런 다음 GLOBIGNORE 변수를 끕니다.
unset GLOBIGNORE
참고: 위 명령에 사용된 플래그의 의미를 이해하려면 다양한 그림에서 사용한 각 명령의 매뉴얼 페이지를 참조하세요.
그게 다야! 동일한 목적을 위해 염두에 두고 있는 다른 명령줄 기술이 있는 경우 아래 피드백 섹션을 통해 공유하는 것을 잊지 마십시오.