일부 파일을 제외한 *.mp4, *.zip 모두 삭제

일부 파일을 제외한 *.mp4, *.zip 모두 삭제

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)"

쉘 인용 규칙을 읽어보세요.

관련 정보