때때로 디렉터리의 모든 파일을 삭제해야 하는 상황이 발생할 수 있습니다. 또는 지정된 일부 형식(지정된 확장자로 끝나는 파일)을 제외한 파일을 삭제하여 단순히 디렉터리를 정리해야 하는 상황이 발생할 수 있습니다.
이번 글에서는 rm, find, globignore 명령을 통해 특정 파일 확장자를 제외한 디렉터리에서 파일을 삭제하거나 입력하는 방법을 보여드리겠습니다.
더 진행하기 전에 Linux의 중요한 개념인 파일 이름 패턴 일치에 대해 간단히 살펴보겠습니다. 이를 통해 당면한 문제를 해결할 수 있습니다.
Linux에서 쉘 패턴은 와일드카드 또는 메타 문자라고 하는 다음과 같은 특수 문자를 포함하는 문자열입니다.
* – 0개 이상의 문자와 일치
? 문자
[sequence] - 시퀀스
[!sequence]의 모든 문자와 일치합니다.
us 시퀀스에 없는 모든 문자와 일치합니다. 여기서는 세 가지 가능한 접근 방식을 살펴보겠습니다. 포함:
확장 패턴 일치 연산자를 사용하여 파일 삭제
아래에는 다양한 확장 패턴 일치 연산자가 나열되어 있습니다. | 하나 이상의 파일 이름을 포함하는 목록 분할입니다.
*(패턴 목록) - 지정된 패턴과 0개 이상 일치 ?(패턴 목록) - 지정된 패턴과 0개 이상 일치 지정된 패턴과 1개 발생 @(패턴 목록) - 지정된 패턴과 1개 이상 일치 !(패턴 목록) - 지정된 패턴 하나를 제외한 모든 항목과 일치 사용하려면 다음을 설정해야 합니다. extglob 쉘 옵션에 다음과 같이 입력합니다:# shopt -s extglob
$ rm -v !("filename")
$ rm -v !("filename1"|"filename2")
$ rm -i !(*.zip)
$ rm -v !(*.zip|*.odt)
지정된 파일 확장자를 제외한 모든 파일 삭제필요한 명령을 모두 실행한 후 다음을 사용하여 extglob 셸 옵션을 끌 수도 있습니다.
$ shopt -u extglob
$ 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] {}
$ find . -type f -not -name '*.gz' -delete
$ find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}
$ find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete
$ cd test $ GLOBIGNORE=*.odt:*.iso:*.txt
$ rm -v *
$ unset GLOBIGNORE
使用 bash 变量 GLOBIGNORE 删除文件
注:为了理解上面的命令行采用的标识的意思,请参考我们在每一个插图中使用的命令对应的 man 手册。