특정 이름의 폴더를 제거하는 방법


139

Linux에서 폴더 계층 구조에 중첩 된 특정 이름의 폴더를 어떻게 제거합니까?

다음 경로는 폴더 아래에 있으며라는 모든 폴더를 제거하고 싶습니다 a.

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

부모 폴더에서 어떤 Linux 명령을 사용해야합니까?


아마도 요점을 놓칠 수도 있지만 누군가를 도울 수도 있습니다. 메인 폴더에 410 개의 폴더가 있습니다. 각 410 개의 폴더에는 두 개의 하위 폴더가 있습니다. 모든 첫 번째 하위 폴더의 이름은 'final'이며 편집 된 pdf 및 Word 컨텐츠 목록을 포함합니다. 이름이 tif_pdf_various_names 인 두 번째 하위 폴더에는 원래 스캔 한 저장 파일을 최대 200 페이지까지 스캔 한 파일, 편집되지 않은 pdf 및 초안 .docx 콘텐츠 목록 (홈 작업 모음)이 포함됩니다. 마지막으로 편집 한 재료 만 포함 된 410 개 폴더 모음을 만들어야했습니다. 발견 된 가장 쉬운 방법은 (Micr
Jurie

답변:


155

대상 디렉토리가 비어 있으면 find를 사용하고 디렉토리 만 필터링하고 이름을 기준으로 필터링 한 다음 rmdir을 실행하십시오.

find . -type d -name a -exec rmdir {} \;

당신이 반복적으로 그 내용을 삭제하려면, 교체 -exec rmdir {} \;에 의해 -delete또는 -prune -exec rm -rf {} \;. 다른 답변에는 이러한 버전에 대한 세부 정보가 포함됩니다.


9
무엇을 설명해 주 {} \;시겠습니까?
winklerrr

6
{}"일치하는 파일 / 폴더마다"로 읽을 수 있습니다. 즉, 각 "찾은"파일 / 폴더를 대체합니다. 절의 \;종결 자입니다 -exec.
wmorrison365

2
디렉토리가 비어 있지 않으면 "삭제할 수 없습니다"라는 오류가 발생합니다
blindeyes

1
-prune@David Grayson 제안에 따라 답변에 플래그를 추가하십시오 . 이것이 없으면 find여전히 누락 된 폴더를 방문하려고 시도하고 결국 Docker 빌드에 실패 할 수있는 오류 코드와 함께 종료됩니다.
Czyzby

160

다음과 같이 이름 "a"에 find를 사용하고 원하는대로 rm을 실행하여 rm을 실행하십시오.

find . -name a -exec rm -rf {} \;

ls를 사용하여 먼저 나열하여 테스트하십시오.

find . -name a -exec ls {} \;

일반 파일이 아닌 디렉토리 만 제거하려면 "-type d"arg를 사용하십시오 (주석에서 제안한대로).

find . -name a -type d -exec rm -rf {} \;

"{}"은 발견 된 각 파일 "a"에 대한 대체입니다. exec 명령은 대체에 의해 각각에 대해 실행됩니다.


4
파일이 같은 이름과 일치하는 경우 "-type d"를 추가하려고 할 수 있습니다.
Mark Loeser

3
또한 이것은 1/2/a/3/4의도하지 않았을 수도 있는 것과 같은 것을 잡을 것이므로, 먼저 테스트 할 것을 권장하는 +1 ...
twalberg

9
echo {}대신 리코 를 먼저 테스트ls {}
Charney Kaye

2
여기 내를 이동합니다 node_modules/.
saruftw

6
삭제 된 각 디렉토리마다 find . -name a -type d -exec rm -rf {} \;인쇄되었지만 사용 하고 작동했습니다 find: ‘./subdir/subdir/a’: No such file or directory.
pacoverflow 2016 년

59

이것은 또한 작동합니다- "a"라는 폴더와 그 내용을 모두 제거합니다 :

rm -rf `find -type d -name a`

@ 버팔로, 어떻게 오세요? 이 defo는 효과가 있지만 다른 것도 마찬가지입니다. 이것이 효과가있는 환경을 찾는 것에 놀랐을지 모르지만 다른 사람들은 모든 대답을 제공하지는 않습니다 find/rm.
wmorrison365

4
@ wmorrison365는 그렇게하면 find . -name a -exec rm -rf {} \;더 많은 항목을 찾기 위해 해당 디렉토리에 들어 가려고 할 때 find가 충돌하여 다음과 같은 오류를 발생시킵니다 find: '1/2/3/a': No such file or directory.
Alex Grönholm

@Alex Grönholm은 물론 'a'라는 이름의 모든 폴더는 삭제됩니다. 당신이 말한대로 find는 나중에 삭제 된 'a'폴더 내부를 볼 수 없지만 중요하지 않습니다. 삭제 전에 후속 처리를 위해 'a'의 내용을 유지하려는 것은 OP가 요청한 것과 다른 사용 사례입니다.
wmorrison365

6
@ wmorrison365 예, 디렉토리가 삭제되었지만 명령이 실패하는 솔루션을 권장하지 않는 것 같습니다 (0이 아닌 종료 코드를 반환 함).
Alex Grönholm

1
이것 때문에 오류가 발생했습니다 illegal option --t. 또한 검색 할 디렉토리 ( stackoverflow.com/questions/25840713/… ) 를 전달해야했습니다 rm -rf `find . -type d -name a`.
Steve Harrison

25

이름이있는 모든 디렉토리를 삭제하려면 foo다음을 실행하십시오.

find -type d -name foo -a -prune -exec rm -rf {} \;

다른 답변에는 중요한 -prune옵션 이 누락되었습니다 . 이 없으면 -pruneGNU find는 이름이 일치하는 디렉토리를 삭제 한 후 재귀하여 일치하는 디렉토리를 더 찾습니다. 이 -prune옵션은 조건과 일치하는 디렉토리로 재귀하지 않도록 지시합니다.


21

node_modules사용하여 진행중인 작업의 백업을 수행하기 전에 폴더 를 삭제하려고했습니다 rsync. 주요 요구 사항은 node_modules폴더를 중첩 할 수 있어야하므로 -prune옵션 이 필요하다는 것입니다.

먼저 삭제할 폴더를 시각적으로 확인하기 위해 이것을 실행했습니다.

find -type d -name node_modules -prune

그런 다음 이것을 실행하여 모두 삭제했습니다.

find -type d -name node_modules -prune -exec rm -rf {} \;

피스 타치 덕분에


훌륭하게 작동했습니다. 이것을 쉽게 사용할 수 있도록하기 위해 이것을 작은 쉘 스크립트로 저장할 수 있습니다. sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell

11
find ./ -name "FOLDERNAME" | xargs rm -Rf

트릭을해야합니다. 실수로 펌프 경우, 경고 .또는 /으로 xargs rm -Rf전체 컴퓨터하는 운영체제 재설치를 요구, 그것을 다시 얻을 옵션없이 삭제됩니다.


2
아, 그 작은 작은 위험. 그게 다야? ㅋ. 경고 해 주셔서 감사합니다. 나는 그 타이핑 실수를 분명히 할 것입니다.
TinkerTenorSoftwareGuy

9

나는 100 개 이상의 파일을 가지고 있었다

log-12
log-123
log-34
....

위의 답변은 저에게 효과가 없었습니다.

그러나 다음 명령이 도움이되었습니다.

find . -name "log-*" -exec rm  -rf {} \;

내가 준 -type으로 .는 시작 두 파일과 폴더를 삭제 있도록log-

rm -rf삭제 폴더는 재귀 심지어는 파일이 있습니다.

폴더 만 원한다면

find -type d -name "log-*" -exec rm  -rf {} \;

파일 만

find -type f -name "log-*" -exec rm  -rf {} \;

8

여러 답변을 결합하여 다음은 Linux 및 MacOS에서 작동하는 명령입니다.

rm -rf $(find . -type d -name __pycache__)

나를 위해 일한 사람도 실수를 던지지
않았습니다

7

다른 것:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)

3
이 답변은 빈 폴더에 대해서만 작동합니다. -delete비어 있지 않은 폴더는 제거하지 않습니다.
maninak

OSX 버전을 추가해 주셔서 감사합니다
schu34

6

이 명령은 저에게 효과적입니다. 재귀 적으로 작업을 수행합니다.

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - 현재 폴더

"node_modules"-폴더 이름


-2

경로 / 경로 / 폴더 찾기 -maxdepth 1 -name "my_ *"-type d -delete

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