웹사이트 검색

확장자가 있는 하나 또는 몇 개의 파일을 제외하고 디렉터리에서 모든 파일을 삭제하는 3가지 방법


때로는 디렉토리의 모든 파일을 삭제해야 하거나 특정 유형의 파일(특정 확장자로 끝나는 파일)을 제외한 모든 파일을 제거하여 디렉토리를 정리해야 하는 상황이 발생할 수 있습니다.

이 문서에서는 rm, findglobignore 명령을 사용하여 특정 파일 확장자 또는 유형을 제외한 디렉토리의 파일을 삭제하는 방법을 보여줍니다.

더 나아가기 전에 Linux의 중요한 개념 중 하나인 파일 이름 패턴 일치를 간략하게 살펴보겠습니다. 이를 통해 당면한 문제를 처리할 수 있습니다.

권장 읽기: Linux에서 find 명령을 사용하여 여러 파일 이름/확장명 검색

Linux에서 셸 패턴은 와일드카드 또는 메타문자라고 하는 다음과 같은 특수 문자로 구성된 문자열입니다.

  1. * – 0개 이상의 문자와 일치합니다.
  2. ? – 모든 단일 문자와 일치합니다.
  3. [seq] – seq의 모든 문자와 일치합니다.
  4. [!seq] – seq에 없는 모든 문자와 일치합니다.

여기에서 살펴볼 세 가지 가능한 방법이 있으며 여기에는 다음이 포함됩니다.

확장 패턴 일치 연산자를 사용하여 파일 삭제

다양한 확장 패턴 일치 연산자가 아래에 나열되어 있습니다. 여기서 pattern-list| 문자를 사용하여 구분된 하나 이상의 파일 이름을 포함하는 목록입니다.

  1. *(pattern-list) – 지정된 패턴이 0개 이상 일치합니다.
  2. ?(pattern-list) – 지정된 패턴이 0개 또는 1개 발생하는 것과 일치합니다.
  3. +(pattern-list) – 지정된 패턴과 하나 이상 일치합니다.
  4. @(pattern-list) – 지정된 패턴 중 하나와 일치합니다.
  5. !(pattern-list) – 주어진 패턴 중 하나를 제외한 모든 항목과 일치합니다.

이를 사용하려면 다음과 같이 extglob 셸 옵션을 활성화하세요.

shopt -s extglob

1. filename을 제외한 디렉토리의 모든 파일을 삭제하려면 아래 명령을 입력하십시오.

rm -v !("filename")

2. filename1filename2을 제외한 모든 파일을 삭제하려면:

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

참고: 위 명령에 사용된 플래그의 의미를 이해하려면 다양한 그림에서 사용한 각 명령의 매뉴얼 페이지를 참조하세요.

그게 다야! 동일한 목적을 위해 염두에 두고 있는 다른 명령줄 기술이 있는 경우 아래 피드백 섹션을 통해 공유하는 것을 잊지 마십시오.