지정된 파일 만 남겨두고 디렉토리의 모든 파일을 제거하고 싶습니다. 이름별로 공통점이 없습니다. 어떻게하면 될까요?
예를 들어, 유지하려는 파일 이름은 다음과 같습니다.
file_1.png
, another_file.jpg
,some_music.mp3
지정된 파일 만 남겨두고 디렉토리의 모든 파일을 제거하고 싶습니다. 이름별로 공통점이 없습니다. 어떻게하면 될까요?
예를 들어, 유지하려는 파일 이름은 다음과 같습니다.
file_1.png
, another_file.jpg
,some_music.mp3
답변:
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 {} +
서브 디렉토리 tmp
를 작성하고 유지하려는 모든 파일을 해당 디렉토리 로 이동 한 rm -f *
후 나중에 수행하십시오 . tmp
디렉토리 에는 영향을 미치지 않습니다 .
그 후 그냥하십시오 :
mv tmp/* .
rmdir tmp
(이동 한 파일이 점으로 시작한다고 가정).
이것은 실제로 Ctrl유지하고 싶은 몇 개의 파일을 클릭 한 다음 메뉴를 사용 Edit -> Invert Selection
하여 다른 파일을 가져온 다음 삭제할 수있는 노틸러스와 같은 파일 브라우저와 마우스를 사용하는 것이 합리적입니다 . .
ls
보존하려는 파일을 놓치지 않았는지 확인 하기 위해를 실행할 수 있습니다 .
유지할 파일 이름을 한 줄에 하나씩 텍스트 파일에 추가하십시오. 이 파일은 디렉토리에 있거나 이름을 추가해야합니다.
디렉토리 이름이 foo 이고 파일 이름이 bar 인 경우 다음을 수행하십시오.
find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm
이것은 다음을 수행합니다.
find -type f
foo 및 해당 서브 디렉토리 의 모든 파일 이름을 검색 하여 STDOUT에 인쇄합니다. 옵션 -print0
을 사용 하면 파일 이름을 NUL 바이트로 구분합니다.grep -v -f bar
bar 의 줄과 일치하는 모든 파일 이름을 제외합니다 . 옵션 -z
을 사용하면 입력을 NUL 바이트로 구분 된 행 세트로 처리하고, 옵션 -Z
을 사용하면 NUL 바이트로 출력을 제거합니다.xargs rm
rm
파일을 삭제하기 위해 반복해서 호출 합니다. 옵션 -0
을 사용하면 입력을 NUL 바이트로 구분 된 행 세트로 처리합니다.공백이 포함 된 파일 이름과 함께 작동합니다.
find
오히려 오히려find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
shopt -u extglob
) 을 포함시키는 것이 유용 할 수 있습니다 .