지정된 파일 만 제외하고 폴더의 모든 파일을 어떻게 제거합니까?


11

지정된 파일 만 남겨두고 디렉토리의 모든 파일을 제거하고 싶습니다. 이름별로 공통점이 없습니다. 어떻게하면 될까요?

예를 들어, 유지하려는 파일 이름은 다음과 같습니다.

file_1.png, another_file.jpg,some_music.mp3

답변:


15

bash를 사용하는 경우 :

shopt -s extglob
rm -- !(file1|file2|file3)

첫 번째 줄은 확장 패턴 일치를 활성화 한 후 그 중 하나를 사용합니다.

!(pattern-list) 주어진 패턴 중 하나를 제외한 모든 것과 일치

pattern-list는로 구분 된 하나 이상의 패턴 목록입니다 |.


또는 zsh

setopt extendedglob
rm -- ^(file1|file2)

또는 다음을 사용하여 휴대 성이 뛰어납니다 find.

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +

3
선택적 쉘 동작을 다시 반환하는 방법 ( shopt -u extglob) 을 포함시키는 것이 유용 할 수 있습니다 .
geedoubleya 2014

7

서브 디렉토리 tmp를 작성하고 유지하려는 모든 파일을 해당 디렉토리 로 이동 한 rm -f *후 나중에 수행하십시오 . tmp디렉토리 에는 영향을 미치지 않습니다 .

그 후 그냥하십시오 :

mv tmp/* .
rmdir tmp

(이동 한 파일이 점으로 시작한다고 가정).

이것은 실제로 Ctrl유지하고 싶은 몇 개의 파일을 클릭 한 다음 메뉴를 사용 Edit -> Invert Selection하여 다른 파일을 가져온 다음 삭제할 수있는 노틸러스와 같은 파일 브라우저와 마우스를 사용하는 것이 합리적입니다 . .


tmp 디렉토리로 파일을 옮기는 것이 좋습니다. 어쨌든, 나는 커맨드 라인으로 이것을해야합니다. 감사!
AGamePlayer

3
@AwQiruiGuo tmp는 원하지 않는 파일을 제거하기 전에 파일을 두 세트로 먼저 분리한다는 이점이 있습니다. 따라서 ls보존하려는 파일을 놓치지 않았는지 확인 하기 위해를 실행할 수 있습니다 .
Anthon

2

유지할 파일 이름을 한 줄에 하나씩 텍스트 파일에 추가하십시오. 이 파일은 디렉토리에 있거나 이름을 추가해야합니다.

디렉토리 이름이 foo 이고 파일 이름이 bar 인 경우 다음을 수행하십시오.

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

이것은 다음을 수행합니다.

  1. find -type ffoo 및 해당 서브 디렉토리 의 모든 파일 이름을 검색 하여 STDOUT에 인쇄합니다. 옵션 -print0을 사용 하면 파일 이름을 NUL 바이트로 구분합니다.
  2. grep -v -f barbar 의 줄과 일치하는 모든 파일 이름을 제외합니다 . 옵션 -z을 사용하면 입력을 NUL 바이트로 구분 된 행 세트로 처리하고, 옵션 -Z을 사용하면 NUL 바이트로 출력을 제거합니다.
  3. xargs rmrm파일을 삭제하기 위해 반복해서 호출 합니다. 옵션 -0을 사용하면 입력을 NUL 바이트로 구분 된 행 세트로 처리합니다.

공백이 포함 된 파일 이름과 함께 작동합니다.


파일 이름에 줄 바꿈이있을 수 있으므로 작동하지 않습니다.
Anthon

@Anthon은 줄 바꿈을 포함하여 공백이 포함 된 파일 이름에 대처하기 위해 find, grep, xargs 옵션을 변경했습니다
Mathias Weidner

당신이 사용하려는 경우 find오히려 오히려find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
jimmij
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.