Windows에서 빈 디렉토리를 재귀 적으로 삭제


93

Windows 7 컴퓨터에는 수천 개의 하위 디렉토리가 아닌 경우 수백 개의 디렉토리가 있습니다. 그들 중 일부는 파일이 있지만 일부는 그렇지 않습니다. 빈 디렉토리를 모두 삭제하고 싶습니다.

del 및 rmdir DOS 명령을 보면 모든 파일을 삭제하지 않고 재귀 적으로이 작업을 수행 할 수있는 것처럼 보이지 않습니다. 명령 행에서이를 수행 할 수있는 방법이 있습니까?


이 질문에 대한 간단한 대답이 없다는 것에 놀랐습니다.
billpg April

@billpg : 간단하게 얻을 수 있습니다 : xcopy FROMDIR TODIR /s. SO 답변 참조 : stackoverflow.com/a/14742810
eckes

1
XCOPY가 디렉토리를 삭제합니까?
billpg

1
ROBOCOPY를 사용하여 쉽게 수행 할 수 있습니다. 자세한 내용은 아래 답변을 참조하십시오.
Varun Sharma

답변:


115

빈 디렉토리 제거 유틸리티를 사용할 수 있습니다 .

또는이 단일 라이너 배치 파일 ( DownloadSquad에서 )을 사용할 수 있습니다 .

for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"

(배치 파일 내에서 사용하는 경우, 교체 %d%%d)

rd파일이 포함 된 디렉토리를 제거하지 않기 때문에 작동 합니다.


6
추신 : 모든 파일을 잠재적으로 삭제할 수있는 명령 줄 명령을 시도하기 전에 GUI 기반 도구를 먼저 사용해 보는 것이 좋습니다.
caliban

1
실제로 비어 있는지 확인하십시오. 숨겨진 desktop.ini는 여전히 파일로 간주됩니다. thumbs.db와 동일합니다. 이것이 작동하는지 확인하려면 비어 있고 채워진 내부 디렉토리가있는 테스트 디렉토리를 작성하십시오. 작동합니다. 확인했습니다.
caliban

1
네. 효과가있다. 내 실수.
EBGreen

8
( 'dir / s / b')에서 / f % d의 경우 rmdir "% d"는 rmdir이 비어 있지 않은 폴더를 제거 할 수 없으므로 작동해야합니다.
seanyboy

1
이 기능을 상황에 맞는 메뉴에 추가하는 방법 은 stackoverflow.com/a/34025977/694360 을 참조하십시오.
mmj

49

ROBOCOPY를 사용할 수도 있습니다. 매우 간단하며 큰 계층 구조에서 빈 폴더를 삭제하는 데 사용할 수도 있습니다.

ROBOCOPY folder1 folder1 /S /MOVE

folder1다른 파일을 다른 폴더로 이동하는 대신 빈 폴더 만 삭제하면되므로 소스와 대상은 모두 입니다. /S옵션은 빈 폴더 복사 (위의 경우 이동)를 건너 뛰는 것입니다. 파일이 동일한 드라이브 내로 이동함에 따라 더 빠릅니다.


1
마법. 따라서 이것은 비어 있지 않은 모든 폴더를 이미 있던 동일한 위치로 옮기고 아무것도하지 않습니까? 그러나 왜 : 그것들을 건너 뛰면 삭제가 발생합니까? 그리고 이것은 중첩 폴더를 옮길 folder1까요? 잘 테스트하지 않으면 무섭습니다.
Arjan

3
@Arjan 나는 그것을 테스트했으며 완벽하게 작동합니다!. 작업을 이해하려면 빈 폴더를 제외한 모든 파일을 다른 위치로 이동 한 다음 왼쪽 빈 폴더를 삭제하는 것과 같습니다. /MOVE파일을 먼저 복사 한 다음 복사 한 후 소스 파일을 삭제합니다. 따라서 /S사용 된 대로 비어 있지 않은 폴더를 대상 (위의 경우 동일한 폴더)에 복사합니다. 그런 다음 빈 폴더를 삭제합니다 (예 : 빈 폴더가 이미 복사되었다는 생각). 아니요, ROBOCOPY는 폴더를 재귀 적으로 이동하므로 중첩 된 폴더는로 이동 하지 않습니다folder1 .
Varun Sharma

3
심지어 UNC 경로 (적어도 win7에서)와 함께 작동합니다! 훌륭한 !
Arioch 'The

2
타사 소프트웨어가 필요없는 매우 우아한 솔루션입니다. 감사합니다!
Marcus Mangelsdorf

1
이것은 단지 마술을하고 완벽하게 작동했습니다. 감사!
CharleyDC5

15

Cygwin은 GNU find와 함께 제공되므로 다음을 수행 할 수 있습니다.

find . -type d -empty -delete

또는 폴더가 더 이상 존재하지 않을 때 소음을 피하려면

find . -type d -empty -execdir rmdir {} +

이제 Windows 10 Bash를 사용하여 수행 할 수도 있습니다.
March Ho

Windows 10을 설치할 find . -type d -empty -delete때 명령 프롬프트에서 다음과 같은 오류 로이 ( )가 실패합니다.FIND: Parameter format not correct
ImpressTheNet Web Developer

7

무료 유틸리티 인 EmptyFolderNuker 는 선택한 기본 폴더에서이 작업을 수행합니다. 또한 빈 서브 디렉토리 만 포함하는 디렉토리를 제거합니다.


1
한 줄짜리 배치 파일이 작동하지 않았으며 (이 시점에서 "%% d은 (는) 예상치 못한 오류입니다."오류가 발생합니다.) 빈 디렉토리 제거 프로그램이 설치되지 않습니다 (링크 된 페이지에 그렇지 않다는 메시지가 표시됨). 어쨌든 Windows 7과 호환됩니다). 이 프로그램은 매력처럼 작동했습니다.
피닉스

1
user36580이 아래에 기술 한 것처럼 "명령 줄에서 직접 실행 중일 수 있습니다.이 경우 이중 %%를 단일 %로 변경하십시오"
Lachlan McD.

1
삭제 된 것을 미리 볼 수 있기 때문에 순수한 명령 줄 버전보다 이것을 좋아합니다. 를 사용하여 항상 명령 줄에서 호출 할 수 있습니다 "%~dp0\EmptyFolderNuker.exe" %cd%.
Jeroen Wiert Pluimers 2014

1
@ rob-kam "EmptyFolderNuker"의 URL을 더 이상 사용할 수 없습니다.
PeterCo

@PeterCo 감사합니다. 이제 수정되었습니다.
Rob Kam

0

당신이있는 경우 의 Cygwin이 설치, 당신이 할 수 있습니다 :

find -type d -exec rmdir {} \;

4
반드시 그런 것은 아닙니다. 하위 디렉토리가 비어있는 디렉토리는 삭제하지 않을 수 있습니다. 반대로해야 할 수도 있습니다. 찾기 유형 d -print0 | 전술 | xargs -0 rmdir
Ryan Thompson

나는 전에 "tac"에 대해 몰랐다. 정말 근사하다!
Anthony Giorgio

1
또는을 사용하십시오 . 이 옵션은 출력 순서를 반대로하는 것과 같은 작업을 수행합니다. 가장 깊은 디렉토리 수준으로 이동 한 다음 백업 방식으로 작동합니다. find (starting-directory) -depth -type d ...-depthfind
G-Man

0

emacs에서 작업하고 있다면 (이 플랫폼에 무관심하게) 다음과 같이 작동합니다.

(defun *-delete-empty-directories (root-directory)
  "Recursively delete empty directories in ROOT-DIRECTORY.

When called from dired, `dired-current-directory' is used for
ROOT-DIRECTORY."

  ;; Interface
  (interactive (list (if (eq major-mode 'dired-mode)
                         (expand-file-name (dired-current-directory))
                       (read-from-minibuffer "Root directory: "))))
  (when (or (null root-directory) (string= "" root-directory))
    (user-error "No root directory provided"))
  (when (called-interactively-p 'interactive)
    (unless (yes-or-no-p (format "Delete all non-empty directories in `%s'? "
                                 root-directory))
      (user-error "Directory `%s' has been left untouched" root-directory)))

  ;; Implementation
  (require 'f)
  (let ((entries (f-directories root-directory)))
    (while entries
      (let ((curdir (car entries)))
        (when (f-directories curdir)
          (*-delete-empty-directories curdir))
        (unless (f-entries curdir)
          (delete-directory curdir)
          (message "Directory deleted: `%s'" curdir))
        (setq entries (cdr entries)))))

... emacs에서이 작업을 수행하기 위해이 모든 것을 입력 할 필요는 없다고 말씀해주십시오.
Hashim

1
@Hashim 아이디어는 init에 정의 한 다음 키에 바인딩한다는 것입니다. 기술적으로 나는 원한다면 묶을 수는 D있지만, 이것에 대한 공통적 인 필요가 없기 때문에, 입력 M-x *ded RET만하면됩니다. (매번 내가 이것을 입력해야한다면, 당신은 그것이 터무니 없다는 것이 옳습니다 – 운 좋게도 그렇지 않습니다.)
Sean Allred

충분히 타당한 것처럼 들립니다.
Hashim

않습니다 M-x *ded RET어떤 의미가 아니면 무작위? 후자의 경우 할당 한 모든 바로 가기를 어떻게 추적 emacs합니까? 암기만으로 충분합니까 아니면 스스로 찾아보아야합니까?
Hashim

1
@Hashim *ded은 전체 기능 이름의 약어입니다 *-delete-empty-directories. 많은 완성 엔진 (예 : 아이비, 내가 사용하는 엔진)은 이러한 종류의 퍼지 매칭을 이해합니다. 그것들을 외워두는 것에 관해서는… 내가 정의한 함수는 모두 *키로 묶이지 않으면 쉽게 찾을 수 있도록 시작 합니다. 그렇지 않으면 emacs 자체가 함수를 호출하는 더 빠른 방법이 있는지 알려줍니다. 다른 모든 것이 실패하면 항상 apropos있습니다.
Sean Allred

0

Gareth와 G-Man의 게시물 결합 :

find . -depth -type d -empty -execdir rmdir {} +

편집 : 그러나 PATH var에 'C'로 인해 보안 오류가 발생했습니다.

$find . -depth -type d -empty | while read dir; do (rmdir -v $dir); done

나는 xargs를 사용하지 않는다.

 while read x; do (command $x); done

입력이있는 한 계속 진행합니다. 결과를 보거나 더 빨리 실행하지 않으려면 '-v'verbose 플래그를 그대로 두십시오.


0

흠 ... 아마도 더 간단한 해결책 :

for /d /r %d in (*.*) do rd "%d"

빈 폴더를 삭제하려는 폴더에서이를 시작하십시오.

/ d-파일이 아닌 폴더에서 작동 / r-하위 디렉토리 재귀

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