일부를 제외한 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?


123

디렉토리의 모든 파일을 삭제해야하지만 일부 파일은 제외하십시오. 예를 들어, 파일이있는 디렉토리에 a b c ... z, 나는 모든을 제외하고 삭제해야 u하고 p. 이 작업을 수행하는 쉬운 방법이 있습니까?


아래의 답변은 훨씬 나아지지만 파일을 읽기 전용으로 저장하고 모두 삭제 한 다음 rm -f를 사용하지 않는 한 원래 권한으로 다시 변경할 수 있습니다. 복원 할 권한을 알아야하며 프로세스 중에 해당 권한에 대한 쓰기 권한이 필요하지 않다는 것을 알아야합니다. 이것이 다른 답변이 더 나은 이유입니다.
Joe

1
숨겨진 파일을 삭제하려면 실행 shopt -s dotglob하기 전에 실행하십시오 rm (...).

답변:


108

이 경우 내가하는 일은 입력하는 것입니다

rm *

그럼 눌러 Ctrl+ X, *확장 * 보이는 모든 파일 이름에.

그런 다음 목록에서 유지하려는 두 파일을 제거하고 마지막으로 명령 줄을 실행할 수 있습니다.


25
*확장 된 파일 목록 이 너무 길지 않는 한 이것이 효과가 있다고 생각합니다 . :-}
Frerich Raabe

9
Esc 뒤에 *가 오면 "*"도 확장됩니다.
slowpoison

2
@SantoshKumar : 그건 말이되지 않습니다. 확장은 항상 작동하지만 나중에 사용하려는 명령에 의존하지 않습니다.
Der Hochstapler

2
@OliverSalzburg 죄송합니다. 조합이 약간 혼란 스럽습니다. Ctrl+ Shift+ x+ 와 같이 작성해야한다고 생각합니다*
Santosh Kumar

2
@SantoshKumar : 그러나 그것은 조합이 아닙니다.
Der Hochstapler

143

rm모든하지만 u,pbash는 단지 입력 :

rm !(u|p)

다음 옵션을 설정해야합니다.

shopt -s extglob

더보기 : glob-Wiki


1
'extglobbing'이 활성화되어 있어야합니다. shopt -s extglob
sparkie

18
shopt -s extglob@Ashot 이 필요합니다 . 또한 디렉토리가 아닌 파일 일뿐이므로 -rf명령 에서 옵션을 제거했습니다 .
slhck

3
선택한 파일 중 하나의 파일을 제외해야하는 경우 다음을 시도하십시오 rm !(index).html.. "index.html"을 제외하고 ".html"로 끝나는 모든 파일이 삭제됩니다.
mzuther

71

당신이 사용할 수있는 find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! 다음 표현을 부정하다
  • -name 파일 이름을 지정합니다
  • -maxdepth 1찾기 프로세스를 지정된 디렉토리로만 만듭니다 ( find기본적으로 디렉토리를 통과합니다)
  • -type f 파일 만 처리합니다 (예 : 디렉토리 제외).
  • -delete 파일을 삭제합니다

그런 다음 find 맨 페이지를 보고 조건을 조정할 수 있습니다.

최신 정보

  • 표현식 요소의 순서는 중요합니다 (문서 참조).
  • -print대신 에 사용하여 명령을 먼저 테스트하십시오.-delete

    find . ! -name u ! -name p -maxdepth 1 -type f -print

5
술어 순서는 여기서 중요합니다. 만약 -delete그 직후에 .재난이 발생 한다면 (CWD의 모든 파일을 삭제할 것입니다)
Michał Šrajer

이것은 다음과 같이 더 간결하게 작성 될 수 있습니다find . -maxdepth 1 -type f -name '[^up]' -delete
kojiro

4
@kojiro 네, 단 하나의 파일 인 파일에만 해당됩니다. 더 복잡한 이름을 사용하면 정규식이 엉망이 될 수 있습니다.
Matteo

2
find가장 친한 친구입니다. 특히 글로브 할 파일이 너무 많을 때
Terence Johnson

43

단순한:

mv상위 디렉토리에있는 파일 rm, 디렉토리 및 그 mv뒤의 파일.


13
외주, mv 더 높은 디렉토리로. 삭제하려는 서브 디렉토리로 mv를 사용하지 마십시오.
Konerak

@Konerak : rm없이는 -r하위 디렉토리를 제거하지 않습니다.
reinierpost 지난

11
이 대상 디렉토리에 같은 이름을 가진 파일을 덮어 쓰게됩니다
마테오

7
이 기능은 유용 할 수 있지만 원자 적이 지 않으며 단기간 동안 디렉토리에서 모든 파일을 효과적으로 제거하기 때문에이를 하향 조정하고 있습니다. 예를 들어 파일이 네트워크에서 공유되는 경우에는 허용되지 않습니다.
sam hocevar

15

이 답변 과 다소 유사 하지만 특별한 옵션이 필요하지 않습니다. 다음과 같은 쉘 (예 : bash, zsh, ksh 등)이 (모호한) / bin / sh에서 지원하는 "고대"기능입니다.

rm [^up]

2
이것은 1 문자 파일 이름에 적용됩니다. 이름이 길수록 sparkie의 답변이 더 좋습니다.
glenn jackman

3
무엇이 잘못 되었나요 rm [^up]*? 나는 비슷한 일을 자주한다.
CVn

3
@ MichaelKjörling-이름이 u 및 p 인 파일뿐만 아니라 u 또는 p로 시작하는 모든 파일을 삭제합니다. OP (@Ashot)는 az 및 u, p 등을 의미한다고 생각합니다. 말 그대로가 아니라 상징적으로.
Sudipta Chatterjee

4
@HobbesofCalvin 그러면 u 또는 p로 시작 하지 않는 모든 파일이 삭제 됩니다.
rjmunro

@rjmunro-고마워요. :)
Sudipta Chatterjee

11

찾기없이하기 :

ls | grep -v '(u|p)' | xargs rm

(편집 : 여기의 다른 곳에서와 같이 "u"와 "v"는 전체 정규 표현식의 일반 버전으로 사용됩니다. 분명히 너무 많은 것들과 일치하지 않도록 정규 표현식을 고정해야합니다.)

다른 사람들이 제안 했듯이이 작업을 많이 수행하려는 경우 스크립트를 원할 것입니다.


grep은 기본적으로 확장 정규 표현식을 처리하지 않습니다 : use -E또는egrep
Matteo

2
이 파일은 a u또는 a를 포함하는 모든 파일을 제외합니다 .p
Matteo

@Matteo 아니요. grep은 파일을 grepping하지 않고 ls 명령의 출력을 grepping합니다. 당신은 같은 것을 생각하고 grep -L (u|p)' * | xargs rm어디 -L목록에 일치하는 항목을 포함하지 않는 파일 이름을 의미합니다.
rjmunro

4
오, 당신은 이름의 포함 된 파일을 의미 u하거나 p하는 포함하는 모든 파일이 아니 u거나를 p. 맞아요. 다음을 사용하여 고칠 수 있습니다egrep -v '^(u|p)$'
rjmunro

1
이 일치 항목을 제외한 모든 항목을 제거하십시오! ls | grep -v 'vuze\|progs' | xargs rm -rf
Nick

6

zsh에서 :

setopt extended_glob  # probably in your .zshrc

그때

rm ^(u|p)

또는

rm *~(u|p)

두 번째는 히스토리 대체 ^에 있어도 작동 $histchars하며 물론 앞에 임의의 glob를 넣을 수 있습니다 ~.


5

GLOBIGNORE는 콜론으로 구분 된 목록을 가져옵니다

GLOBIGNORE=u:p
rm *

12
이것은 내 쉘에서 작동하지 않습니다 (GNU bash 4.1.5 (1)). 먼저rm 테스트 디렉토리 보다 약간 덜 유해한 것으로 테스트해야합니다!
CVn

3

플로피 시대로 돌아가서 "Except"라는 dos 실행 파일을 사용하여 현재 디렉토리에서 일시적으로 항목을 옮기고 명령을 실행하면 다음과 같이 말할 수 있습니다.

* .txt del *. * 제외

텍스트 파일을 제외한 모든 것을 삭제합니다.

이것은 쉘 스크립트로 구현하기에는 아주 사소한 일이며 이것이 두 번 이상 수행 할 가능성이있는 경우 좋은 생각 인 것 같습니다.


2
그것은 나에게 같은 것을 상기시켰다. 그러나 임시 폴더 밖으로 이동하는 :) 멀티 태스킹의 시대에 좋은 생각되지 않을 수도 있습니다
Sedat Kapanoglu

3
 find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

유닉스에서 u와 p를 제외한 모든 파일이 삭제됩니다.


2

완전 불완전 정규 표현식, posix-awk 또는 posix 확장 스타일로 임의의 복잡한 제외 패턴 (영향을받는 모든 파일 이름을 스패닝)을 지정하는 것을 선호하는 사람들에게는이 방법을 권장합니다. 그것은 제외 u하고 p이 예에서는 현재 디렉토리입니다. 스크립트에 유용 할 수 있습니다.

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf

표현식 앞에 디렉토리를 지정해야합니다 (`find. -regextype ...).
Matteo

-regextypeGNU 버전에서만 작동합니다
Matteo

없음 - 현재 디렉토리를 사용해야하는 경우 내 발견 버전 (데비안 스퀴즈는) 결정적으로 발현하기 전에 명시 적 디렉토리를 필요로하지 않습니다
sparkie

@sparke : 이것은 GNU 구현에서만 작동합니다
Matteo

@sparkie : 디렉토리를 정의하지 않으면 (첫 번째 매개 변수) findGNU 확장 find명령입니다. -regextype옵션도 마찬가지 입니다. 또한 명령은 하위 디렉토리의 파일도 삭제하지만 원래 질문은 디렉토리의 파일에 대해 명확하게 묻습니다.
Mikko Rantalainen

1

나는 항상 사용합니다 :

rm [a-o,q-t,v-z]*

이를 통해 원하는 세분화 정도를 정의 할 수 있습니다. 따라서 관통 o 및 Z 파일을 삭제하려면 다음을 사용할 수 있습니다.

rm [a-o,z]*

1

또 다른 버전은 다음을 사용합니다 xargs.

ls -1 | grep -v do_not_delete | xargs -I files rm "files"

참고가 xargs -I제대로 공간을 포함하여 파일 이름을 처리하기 위해 필요하다.


1

또 다른 :

for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;

그것은 길고 길며 쉽게 수용 할 수있는 함수와 임의의 수의 인수로 쉽게 만들 수 있는지 잘 모르겠지만 잘 작동합니다.

그리고 그것은 순수한 bash 선입니다.


1

다른 변형이 있습니다. 다음을 입력 할 수 있습니다.

rm -i *

또는:

rm --interactive *

따라서 rm각 파일의 삭제를 확인하라는 메시지가 표시됩니다.


1

사용하다:

find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

u, p 및 .ext 파일을 제외한 디렉토리를 포함한 모든 파일을 삭제합니다.


0

엉망이되는 간단한 방법 : * .pdf를 제외한 모든 것을 삭제한다고 가정 해 봅시다.

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.