![일부 파일을 제외한 *.mp4, *.zip 모두 삭제](https://linux55.com/image/4039/%EC%9D%BC%EB%B6%80%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%A0%9C%EC%99%B8%ED%95%9C%20*.mp4%2C%20*.zip%20%EB%AA%A8%EB%91%90%20%EC%82%AD%EC%A0%9C.png)
bash
내 프로그램 중 하나에서 디렉터리의 모든 파일을 삭제하는 명령을 호출 하지만 그 중 일부는 다음과 같습니다.
bash -c
shopt -s extglob
shopt -s nullglob
rm /path/to/directory/!("file1" | "file2")
내가 이해한 바로는 "이 명령에 bash를 사용하고, 확장 모드를 사용하고, 이 파일을 제외한 모든 파일을 삭제하세요"를 의미합니다.
잘 작동하지만 명령에 있는 파일을 제외한 모든 파일을 삭제합니다.
내가 원하는 것은 디렉토리의 모든 .mp4 및 .zip을 삭제하고 명령에 넣은 내용을 삭제하는 것입니다.
명령 어딘가에 *.mp4와 *.zip을 추가해야 할 것 같은데 어디에 있는지 모르겠습니다.
편집: 명확성을 위해 필요한 것은 "모든 .mp4 및 .zip 파일을 삭제하되 이 파일은 유지"하는 것입니다.
답변1
이 패턴은 공백을 제외한 모든 파일과 !("file1" | "file2")
일치합니다 . file1␣
당신이 그것을 언급하는 방식은 오해의 소지가 있습니다: 그것은 or )`와 동일합니다.␣file2
␣
!(file1 | file2)
!("file1 "|" file2
Bash에서는 "저것을 제외한 모든 것"을 의미하기 위해 네거티브 모드와 포지티브 모드를 결합하는 방법이 없습니다. zsh에서는 이렇게 쓸 수 있습니다
setopt extended_glob
rm /path/to/directory/*.(mp4|zip)~(keep*|1234.zip)
this.mp4
및 는 제거 that.zip
하지만 keep-this.mp4
또는 은 제거하지 않습니다 1234.zip
.
Bash에서는 설정할 수 있습니다GLOBIGNORE
바꾸다모든 일치 항목에서 특정 패턴을 제외합니다.
shopt -s extglob
GLOBIGNORE='keep*:1234.zip'
rm /path/to/directory/*.(mp4|zip)
unset GLOBIGNORE
find
또는 임의로 복잡한 성격의 부울 표현식을 작성할 수 있는 를 사용할 수 있습니다 .
find /path/to/directory \( -name '*.mp4' -o -name '*.zip' \) ! -name 'keep*' ! -name '1234.zip' -delete
find
하위 디렉터리로의 재귀를 확인하세요 . 필요하지 않은 경우 -maxdepth 1
나중에 추가하세요 /path/to/directory
.
find
이해가 되지 않는다면 ( -maxdepth
일반적이지만 표준은 아님) 대신 사용하세요 -type d -prune -o
. (동일한 설명) find
이해가 되지 않으면 대신 해당 설명을 사용하십시오.-delete
-exec rm {} +
답변2
여러 가지 방법이 있습니다:
- find 사용(특정 쉘 [bash]가 필요하지 않으므로 이식 가능)
찾다. -최대 깊이 1! -이름 "제외" -삭제
또는 여러 모드가 있는 경우:
찾다. -최대 깊이 1! \(-name "제외" -o -name "제외 2"\)-exec rm -f {}\+
- GLOBIGNORE 변수 사용(bash에만 해당)
내보내기 GLOBIGNORE=제외:제외1:마스크*
이렇게 하면 언급된 파일과 마스크가 전체적으로 제외됩니다. 그런 다음 지정할 수 있습니다rm your_pattern
먼저 시도해 볼 수 있습니다.ls
답변3
꼭 찾아주셨으면 합니다. 그러나 문제는 공간입니다.
rm /path/to/directory/!("file1" | "file2")
동일합니까?
rm "/path/to/directory/!(file1" "|" "file2)"
아니요
rm "/path/to/directory/!(file1|file2)"
쉘 인용 규칙을 읽어보세요.