리눅스에서 "test"라는 이름의 모든 디렉토리를 찾아 삭제


35

"test"라는 이름의 디렉토리가 많이 있으며 제거하고 싶습니다.

찾아서 인쇄하는 방법을 알고 있습니다.

find . -name test -print

이제 디렉토리를 어떻게 제거합니까?


디렉토리에도 파일이 있으므로 제거해야합니다.

답변:


70

xargs 모든 마술을한다 :

find . -name test -type d -print0|xargs -0 rm -r --

xargs stdin에 전달 된 인수와 함께 매개 변수로 전달 된 명령을 실행합니다.

rm -r디렉토리와 모든 하위를 삭제하는 데 사용 됩니다.

--시작하는 경로 피하기 위해 인수의 끝을 나타낸다 -인자로 처리되는 것이있다.

-print0줄 바꿈 대신 문자 find를 인쇄하도록 지시 합니다 \0. 그리고 -0이야기 xargs만을 치료하기 위해 \0인수 구분한다.

이것은 rm많은 디렉토리를 한 번에 호출 rm하여 각 디렉토리에 대해 별도로 호출하는 오버 헤드를 피합니다 .


대안으로, 선택한find 각 파일 에 대해 명령을 실행할 수도 있습니다 .

find . -name test -type d -exec rm -r {} \;

그리고 전화 때문에 더 나은 성능이 하나, rm함께 한 번에 여러 디렉토리 :

find . -name test -type d -exec rm -r {} +

( +끝 부분에 주목하십시오 . 이것은 xargs솔루션 과 같습니다 .)


1
특히 대답에서 훌륭한 답변 +입니다. 나는 오래 전에 알고 있었으면 좋겠다는 것을 전혀 몰랐다.
Scott

마지막 명령을 조심하십시오. 어떻게 든 일부 파일이 삭제되었습니다. xargs명령은 잘 작동.
Henrique de Sousa

23
find /path/to/dir -name "test" -type d -delete
  • -name : 전달 된 이름을 찾습니다. -regex정규식을 기반으로 이름을 제공하는 데 사용할 수 있습니다

  • -type : 파일 형식을 찾습니다. d디렉토리 만 찾습니다

  • -delete : 발견 된 목록을 삭제하는 조치입니다.

또는

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

JF 세바스찬 의견에 명시된 :

한 번에 둘 이상의 디렉토리를 전달 하는 +대신 사용할 수 있습니다 \;.


1
죄송합니다.이 디렉토리에는 파일이있을 수 있습니다. 나는 때문에 그들 중 일부를 삭제할 수 없습니다 "찾을 :`./start를 삭제할 수 없습니다 : 디렉토리가 비어 있지"오류
가비지 컬렉션

@garbagecollection 업데이트를 추가했습니다.
jaypal singh

3
한 번에 둘 이상의 디렉토리를 전달 하는 +대신 사용할 수 있습니다 \;.
jfs

감사합니다 @JFSebastian 좋은 지적입니다. 답변에 추가하겠습니다.
jaypal singh


5

-exec 옵션을 사용할 수도 있습니다

find . -name test -exec rm {} \;

3

bash 4+ 가정

shopt -s globstar
rm -r ./**/test/

후행 슬래시는 디렉토리와 만 일치 함을 의미합니다. 테스트는 다음과 같이 미리 수행됩니다.

printf '%s\n' ./**/test/

2

gnu find를 사용한다고 가정하면 -delete 옵션을 사용할 수 있습니다.

find . -name test -delete

기억하기가 더 쉽습니다.


2

다른 답변에서 알 수 있듯이 이름이 있는 모든 디렉토리 를 찾아서 test삭제할 수 있습니다

find -name "test" -type d -delete

Mac에서 교차 호환성과 관련된 몇 가지 문제가 발생하여 다음과 같은 명령을 사용했습니다.

find -path "*/test" -type d -delete
  • -path : 정규화 된 파일 이름에서 패턴을 찾습니다.

라는 이름의 디렉토리 중 하나가 경우 각각의 경우에, test그 (것)들에있는 파일이, find그 불평 것 Directory is not empty, 그리고 디렉토리를 제거 할 수 없게됩니다.

디렉토리를 포함한 모든 파일삭제 하려는 경우 test동일한 트릭을 사용하여 testfirst 라는 디렉토리 내의 모든 파일을 삭제할 수 있습니다 .

find -path "*/test/*" -delete

패턴 : "*/test/*"은 디렉토리 안에있는 파일 만 삭제하도록합니다 /test/. 디렉토리가 비어 있으면 첫 번째 명령을 사용하여 디렉토리를 삭제할 수 있습니다.

find -path "*/test" -type d -delete

예:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.