파일 X, Y 및 Z를 제외한 폴더의 모든 파일 삭제


17

특정 폴더에 많은 파일 폴더가 있고 모든 파일 폴더를 삭제하고 싶습니다. 그러나 파일 X, Y 및 Z를 유지하고 싶었습니다.

내가 할 수있는 방법이 있습니까? rm * | but NOT grep | X or Y or Z


나는 거기에 정규 표현식을 사용할 수 있다고 가정합니까?
Amit

답변:


16

rm을 사용하는 대신 find 를 사용하는 것이 더 쉬울 수 있습니다 . 이와 같은 명령은 정확히 'file'이라는 파일을 제외한 모든 것을 삭제합니다.

find . \! -name 'file' -delete

많은 버전은 글 로빙 및 정규식 일치를 지원할 수 있어야합니다.

또한 find의 결과를 rm으로 파이프 할 수도 있습니다.

find . \! -name '*pattern*' -print0 | xargs --null rm 

3
그리고 이것은 당신이 파일을 제거하여 삭제됩니다 정확히 볼 수 있습니다 -delete뿐만 아니라 파일이 저장됩니다 무엇에 의해 제거 -delete하고 \!.
Shawn J. Goff

1
조심, find재귀입니다! 따라서 ' pattern '과 일치하지 않는 모든 파일 하위 디렉토리도 삭제됩니다.
Alexandre Holden Daly

xargs를 통한 방법은 파일에 포함 된 파일보다 먼저 디렉토리를 삭제하지 못하도록하기 위해 -depth가 필요합니다. 그러나 rm은 디렉토리를 제거하지 않을 것이라고 생각합니다.
사용자가 알 수 없음

9

연산자를 setopt EXTENDED_GLOB사용하여 와 함께 zsh 사용 ~( 제외 )

rm -- *~(x|y|z)

또는 ^연산자 (음수) :

rm -- ^(x|y|z)

그러나 파일을 다른 곳으로 이동 한 다음 모든 것을 삭제해야합니다. 손가락이 너무 빨리 들어가는 등 손가락 미끄러짐이 훨씬 안전합니다.


5

최신 버전의 bash에는 extglob원하는 것을 수행하기위한 구문을 제공 하는 쉘 옵션이 있습니다 (설치된 버전이 있는지 확인하려면 "Pathname Expansion"의 맨 페이지를 확인하십시오).

$ shopt -s extglob  # turn on extended globbing
$ rm !(X|Y|Z)

테스트하려면, 내가 먼저 교체 제안 rm으로 echo삭제 될 파일 목록이 예상 한대로인지 확인 할 수 있습니다.


5
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r

주의 : 명령을 실행하고 삭제할 파일이 올바른 파일이면 다시 실행하고 해시 문자 "#"을 삭제하십시오.

파일 이름이 더 복잡하면 그렇게하십시오.

ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r

다시 한 번 결과를보고 해시 부호를 제거하십시오.

주석에서 제안한이 버전은 일부 문자를 저장하고 조금 더 명확 해 보입니다.

ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r

ddeimeke 가 제안한 편집 은 다음과 같이 egrep인수를 변경하는 것입니다."^(file1|filename2|f1le)$"
Michael Mrozek

세 개의 파일이있는 경우 a, b그리고 a b첫 번째 프로그램이 삭제됩니다 - 당신은 grep 부분에 AB를 넣을 경우 : "^[ab]$" ab하지만 a b, 당신의 의도에 반대했다. 두 번째 명령도 동일하게 수행됩니다. 그리고 세 번째도. 매우 드문 경우를 제외하고 스크립트에서 'ls'를 사용해서는 안됩니다. 하지 마십시오.
사용자가 알 수 없음

3

보관하려는 파일을 이동하십시오. 한 수준 위로 이동하여 폴더를 삭제하십시오. 폴더를 다시 만들고 해당 파일을 다시 이동하십시오.


왜 마이너스인지 궁금하십니까? .. 실제로 다른 사람들이 제안한 것보다 쉽고 안전합니다. 파일 이름에 특수 문자를 쳐서 발로 쏠 수는 없습니다.
alex

a) 파일 X가 한 디렉토리 위로 이동합니다. 파일 X가 존재하는 곳-자동 삭제, 사라짐. b) 당신은 'up'이 존재하지 않는 최상위 디렉토리에 있습니다. c) 당신은 당신의 집에 있고 / home에 쓸 수있는 권한이 없습니다. 조언을 스크립트에 넣고 문제없이 테스트하고 그런 상황에서 사용하는 경우-peng!
사용자가 알 수 없음

2
a) 이봐, '파일 한 수준 위로 이동 '이라고 했습니까? 나는 그들을 멀리 이동 말했다. b)에있는 모든 파일을 제거하려고 /합니까? 실용적이지 않습니다. c) 귀하의 모든 파일을 제거하려고 시도하는 $HOME것도 실제로 실용적이지 않습니다.
alex

네 말이 맞아 미안해
사용자가 알 수 없음

0

이것이 내가 OSX / MacOS 로그 아웃 후크를위한 .sh 스크립트로 설정 한 것입니다.

#! /bin/bash
for dir in /PathToFolder/*
 do
    if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then 
      echo ${dir}
      sudo rm -R $dir user
      dscl . -delete $dir
    fi 
  done

exit 0

0

GNU-find를 사용하면 비어있는 경우 디렉토리를 제거하는 -delete 스위치를 사용할 수 있습니다.

 find tmp -not -name X -not -name Y -not -name Z -delete 

X, Y 또는 Z가 디렉토리 인 경우 내부 파일도 삭제됩니다. find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete이 문제를 해결하는 한 가지 방법입니다.
Gilles 'SO- 악마 중지'

유닉스 아래의 폴더는 파일이기 때문에 (아무것도 파일 임) 그게 의도 된 것일 수 있습니다. "특정 폴더에 많은 파일과 폴더가 있고 모두 삭제하고 싶습니다."-Y를 제외하려면 Y가 디렉토리인지 아닌지 알 수 있습니다.
사용자가 알 수 없음

/ / 파일 tmp이 없으면 삭제 될 것입니다. GNU와 동등한 표준 ( GNU 확장) 으로 주목하십시오XYZ!-not-delete
Stéphane Chazelas

@ StéphaneChazelas : 질문에서 폴더 (모든 폴더)를 삭제하는 것이 요청되었습니다. 뱅은 마스킹이 필요하므로 입력하지 않는 것이 좋습니다. Backslash에 Alt-Gr이 필요한 독일어 키보드 레이아웃에 따라 달라질 수 있습니다.
사용자가 알 수 없음
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.