source

Windows 명령 프롬프트에서 특정 디렉터리의 파일/하위 폴더를 삭제하는 방법

ittop 2023. 4. 12. 23:01
반응형

Windows 명령 프롬프트에서 특정 디렉터리의 파일/하위 폴더를 삭제하는 방법

를 들어, ''라는 변수가 있습니다.%pathtofolder%이데올로기 때문에

이 디렉토리의 모든 파일 및 하위 폴더를 삭제하지만 디렉토리 자체는 삭제하지 않습니다.

그러나 '이 파일/폴더는 이미 사용 중입니다'와 같은 오류가 있을 수 있습니다.이 경우 해당 파일/폴더는 건너뛰고 계속 진행됩니다.

이에 대한 명령어가 있습니까?

rmdir 제가 가장 좋아하는 명령어입니다.하위 폴더가 있는 대용량 파일 및 폴더를 삭제할 때 작동합니다.백업이 생성되지 않으므로 이 명령을 실행하기 전에 파일을 안전하게 복사했는지 확인하십시오.

RMDIR "FOLDERNAME" /S /Q

그러면 폴더와 모든 파일 및 하위 폴더가 자동으로 제거됩니다.

이 셸하여 내 할 수 .C:\Temp 출처:

del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q

위의 명령어를 포함하는 배치파일(예를 들어 delete.bat)을 만듭니다.delete.bat 파일이 있는 위치로 이동한 후 delete 명령을 실행합니다.박쥐

제가 생각할 수 있는 가장 간단한 해결책은 디렉토리 전체를 삭제하는 것입니다.

RD /S /Q folderPath

그런 다음 이 디렉토리를 다시 만듭니다.

MD folderPath

그러면 폴더와 파일이 삭제되고 폴더는 남겨집니다.

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
@ECHO OFF

SET THEDIR=path-to-folder

Echo Deleting all files from %THEDIR%
DEL "%THEDIR%\*" /F /Q /A

Echo Deleting all folders from %THEDIR%
FOR /F "eol=| delims=" %%I in ('dir "%THEDIR%\*" /AD /B 2^>nul') do rd /Q /S "%THEDIR%\%%I"
@ECHO Folder deleted.

EXIT

...모든 파일과 폴더를 지정된 디렉토리 아래에 저장하지만 디렉토리 자체는 삭제하지 않습니다.

CD [Your_Folder]
RMDIR /S /Q .

RMDIR 명령이 현재 폴더에 액세스할 수 없으므로 삭제할 수 없다는 오류 메시지가 나타납니다.

업데이트:

이 유익한 코멘트(Moritz Both덕분에)로부터, 다음과 같이 덧붙일 수 있습니다.&& 사이, '''는RMDIR 뛰면 안 가다CD명령이 실패합니다(예: 잘못 입력된 디렉토리 이름):

CD [Your_Folder] && RMDIR /S /Q .

Windows 명령줄 레퍼런스:

/S: 디렉토리 트리(지정된 디렉토리 및 모든 파일을 포함한 모든 하위 디렉토리)를 삭제합니다.

/Q: Quiet 모드를 지정합니다.디렉토리 트리를 삭제할 때 확인을 요구하지 않습니다.(/q는 /s가 지정되어 있는 경우에만 기능합니다).

RD는 REMOVE Directory의 약자입니다.

/S : 폴더 자체와 더불어 모든 파일과 하위 폴더를 삭제합니다.이를 통해 전체 폴더 트리를 제거합니다.

/Q : Quiet - YN 확인을 표시하지 않음

예:

RD /S /Q C:/folder_path/here

Powershell 사용

Remove-Item c:\scripts\* -recurse

폴더 자체가 아니라 폴더의 내용이 제거됩니다.

메모장을 사용하여 텍스트 문서를 만들고 복사/붙여넣기:

rmdir /s/q "%temp%"
mkdir "%temp%"

다른 이름으로 저장 및 파일 이름 선택:

delete_module.bat

유형으로 저장:모든 파일을 입력하고 버튼을 클릭합니다.

모든 종류의 계정(관리자 또는 표준 사용자)에서 작동합니다.그냥 실행해!

이 예에서는 임시 변수를 사용하지만 다른 변수를 사용할 수 있습니다.PS: Windows OS 전용!

foxidrive에 의해 게시된 단일 명령줄제외하고 2018-06-01에 게시된 답변 어느 것도 실제로 모든 파일과 폴더/디렉토리를 삭제합니다.%PathToFolder%따라서 폴더의 모든 파일과 하위 폴더를 삭제하는 매우 간단한 단일 명령줄을 사용하여 하나 이상의 답변을 게시해야 합니다. 또한 DEL과 RD사용하여 2018-06-01에 게시된 다른 모든 답변이 폴더를 완전히 정리하지 못한 이유를 설명하는 보다 복잡한 솔루션을 가진 배치 파일을 게시해야 합니다.


배치 파일에서도 사용할 수 있는 심플한 단일 명령줄 솔루션:

pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )

이 명령줄에는 3개의 명령어가 차례로 실행됩니다.

첫 번째 명령어 PUSHD는 스택 상의 현재 디렉토리 경로를 푸시하고 다음 명령어는%PathToFolder%명령어 프로세스를 실행하기 위한 현재 디렉토리.

명령 확장자는 기본적으로 실행되며 이 경우 PUSHD는 지정된 네트워크 리소스를 가리키는 임시 드라이브 문자를 생성한 다음 새로 정의된 드라이브 문자를 사용하여 현재 드라이브 및 디렉터리를 변경하므로 UNC 경로에도 기본적으로 작동합니다.

PUSHD는 지정된 디렉토리가 존재하지 않는 경우 STDERR을 처리하기 위해 다음 오류 메시지를 출력합니다.

지정된 경로를 찾을 수 없습니다.

는, 메세지의 됩니다.2>nul디바이스 NUL에 접속합니다.

다음 명령어 RD는 현재 명령어프로세스의 현재 디렉토리를 지정된 디렉토리로 변경하는 데 성공한 경우, 즉 지정된 디렉토리가 존재하는 경우에만 실행됩니다.

RD 명령과 옵션/Q ★★★★★★★★★★★★★★★★★」/S는, 지정된 디렉토리에 숨김 어트리뷰트 또는 읽기 전용 어트리뷰트가 설정된 파일 또는 폴더가 포함되어 있는 경우에서도, 모든 서브 디렉토리와 함께 디렉토리를 조용히 삭제합니다.시스템 속성은 파일 또는 폴더 삭제를 차단하지 않습니다.

삭제되지 않은 항목은 다음과 같습니다.

  1. 실행 중인 프로세스의 현재 디렉토리로 사용되는 폴더.폴더가 실행 중인 프로세스의 현재 디렉토리로 사용되는 경우 이러한 폴더의 전체 폴더 트리는 삭제할 수 없습니다.

  2. 실행 중인 프로세스에서 현재 열려 있는 파일이며, 실행 중인 응용 프로그램/프로세스에서 파일을 여는 동안 파일이 삭제되지 않도록 파일에 대한 접근 권한이 열려 있습니다.이러한 파일을 열면 폴더 트리 전체가 열린 파일에 삭제되지 않습니다.

  3. 현재 사용자가 파일/폴더를 삭제하는 데 필요한(NTFS) 권한이 없는 파일/폴더. 이 파일/폴더에 대한 폴더 트리를 삭제할 수도 없습니다.

폴더를 삭제하지 않는 첫 번째 이유는 이 명령줄에서 지정된 폴더의 모든 파일 및 하위 폴더를 삭제하는 데 사용되며 폴더 자체는 삭제되지 않습니다.폴더는 일시적으로 명령어프로세스를 실행하기 위한 현재 디렉토리가 되어 폴더 자체를 삭제할 수 없게 됩니다.물론 명령어 RD에 의해 오류 메시지가 출력됩니다.

파일이 다른 프로세스에서 사용되고 있기 때문에 파일에 액세스할 수 없습니다.

실제로는 폴더가 다른 프로세스, 즉 명령 RD를 실행한 현재 명령 프로세스에서 사용되고 있기 때문에 여기서 파일은 잘못된 용어입니다.음, 실제로 폴더는 파일 시스템용 특수 파일이며, 파일 속성 디렉토리는 이 오류 메시지를 설명합니다.그러나 파일 시스템 관리에 대해 너무 깊이 파고들고 싶지는 않습니다.

이유로 할 수 다른 메시지와 이 메시지는 "3"으로 됩니다.2>nul핸들 STDERR에서 디바이스 NUL로 이동합니다.

세 번째 명령어 POPD는 명령어 RD의 종료값과는 독립적으로 실행됩니다.

POPD는 PUSHD에 의해 푸시된 디렉토리 경로를 스택에서 팝업하고 명령 프로세스를 실행하기 위한 현재 디렉토리를 이 디렉토리로 변경합니다. 즉, 초기 현재 디렉토리를 복원합니다.POPD는 UNC 폴더 경로의 경우 PUSHD에서 생성한 임시 드라이브 문자를 삭제합니다.

주의: POPD는 초기 현재 디렉토리가 더 이상 존재하지 않는 정리할 디렉토리의 하위 디렉토리인 경우 초기 현재 디렉토리를 자동으로 복원하지 못할 수 있습니다.이 특별한 경우%PathToFolder%는 현재 디렉토리로 유지됩니다. 위의 을 라음 of of of of of of of of of of of 하지 않는 것이 .%PathToFolder%.

가지 흥미로운 사실은 로컬 디렉토리를 공유하여 UNC 경로를 사용하여 명령줄도 시도했습니다.C:\Temp '''를 Temp UNC 경로 UNC 사용\\%COMPUTERNAME%\Temp\CleanTest되어 있다.PathToFolderWindows 7 의 windows 。경로를 즉 UNC는 커맨드 실행의 서브 디렉토리입니다.C:\Temp\CleanTest\Subfolder1,Subfolder1RD에 의해 삭제되고 다음 POPD가 자동으로 실패하여C:\Temp\CleanTest\Subfolder1의 결과로서 「」가 됩니다.Z:\CleanTest실행 중인 명령어프로세스의 현재 디렉토리로 남습니다.이 가 변경될 드라이브 있습니다. , "Directory"는 "Directory"로 됩니다. ★★★★★★★★★★★★★★★★★,cd /D %SystemRoot%로컬 디렉토리로 이동합니다.유감스럽게도 POPD는 초기 현재 디렉토리를 복원하지 못한 경우 0보다 큰 값으로 종료되지 않으므로 POPD의 종료 코드만 사용하여 이 매우 특별한 오류 상태를 검출할 수 없습니다.그러나 UNC 경로는 보통 로컬 파일 및 폴더에 액세스하기 위해 사용되지 않기 때문에 아무도 이 매우 특별한 오류 사례에 부딪히지 않는다고 가정할 수 있습니다.

사용되는 명령어를 보다 잘 이해하려면 명령어프롬프트 창을 열고 다음 명령을 실행하여 각 명령어에 표시되는 도움말을 주의 깊게 읽어보십시오.

  • pushd /?
  • popd /?
  • rd /?

Windows 배치 파일을 사용한 여러 명령어가 포함된 한 에 연산자가 설명되어 있습니다.&& ★★★★★★★★★★★★★★★★★」&여기서 사용됩니다.


다음으로 DEL 명령어를 사용하여 배치 파일솔루션에 대해 설명하겠습니다.%PathToFolder% FOR 및 RD를 사용하여 하위 폴더를 삭제합니다.%PathToFolder%.

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"

rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"

rem Did the folder path consist only of double quotes?
if not defined PathToFolder goto EndCleanFolder

rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"

rem Did the folder path consist only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder

rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul

rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

:EndCleanFolder
endlocal

은 먼저 " " " 를 합니다.PathToFolder는 큰따옴표와 백슬래시가 없는 폴더 경로로 정의됩니다. 폴더 의 큰따옴표는 가 될 수 . 이 값은 '따옴표'이기입니다.PathToFolder는 배치 파일 실행 중에 다른 문자열과 연결됩니다.

중요한 것은 다음 두 줄입니다.

del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

DEL 명령어는 지정된 디렉토리 내의 모든 파일을 삭제하기 위해 사용합니다.

  • " "/ADEL이 옵션을 사용하지 않으면 무시되는 숨겨진 속성을 가진 파일을 포함한 모든 파일을 처리하기 위해 필요합니다./A.
  • " "/F는 읽기 이 set 「읽기 전용」으로 설정되어 하기 위해서 필요합니다.
  • " "/Q는 여러 파일을 삭제해야 하는지 여부를 사용자에게 묻지 않고 여러 파일을 조용히 삭제하기 위해 필요합니다.
  • >nul는 STDOUT 처리를 위해 작성된 파일명의 출력을 디바이스 NUL로 리다이렉트하기 위해 필요합니다.이 디바이스 NUL은 현재 파일이 열려 있거나 사용자에게 파일을 삭제할 권한이 없기 때문에 삭제할 수 없습니다.
  • 2>nul는 핸들 STDERR에서 디바이스 NUL로 삭제할 수 없는 각 파일의 오류 메시지 출력을 리다이렉트하기 위해 필요합니다.

FOR RD 명령은 지정된 디렉토리의 모든 하위 디렉토리를 제거하는 데 사용됩니다.그렇지만for /D이 경우 FOR는 숨겨진 Atribut이 설정된 서브 디렉토리를 무시하기 때문에는 사용되지 않습니다.그렇기 때문에for /F는, 하기 위해서 합니다.%ComSpec% /c:

dir "%PathToFolder%\*" /AD /B 2>nul

DIR 출력은 다음과 같은 이유로 베어 포맷으로 출력됩니다./B 「」를 .D 경로 등 하지 않는 의 모든 2>nul는 핸들 STDERR에서 디바이스 NUL로 디렉토리를 찾을 수 없는 경우의 DIR에 의한 오류 메시지 출력을 리다이렉트하기 위해 사용됩니다.

연산자 'da'>.^FOR 명령줄에서 Windows 명령어인터프리터가 이 명령줄을 처리한 후 임베디드 명령어를 실행하는 FOR 명령줄을 리터럴 문자로 해석합니다.dir별도의 명령어 프로세스의 명령줄은 백그라운드에서 시작됩니다.

의 경우, 기동된 명령어프로세스의 STDOUT 를 처리하기 위해서 작성된 캡처된 출력을 처리합니다.이것은 패스가 없는 서브 디렉토리의 이름이며, 큰따옴표로 둘러싸지 않습니다.

옵션 포함 FOR/F여기서 DIR로 발생하지 않는 빈 행을 무시합니다(옵션 포함)./B는 빈 행을 출력하지 않습니다.

FOR은 기본 줄 끝 문자인 세미콜론으로 시작하는 줄도 무시합니다.디렉토리명은 세미콜론으로 시작할 수 있습니다.그렇기 때문에eol=|세로 막대 문자를 이름에 포함할 수 없는 행 끝 문자로 정의하기 위해 사용합니다.

FOR은 공백과 수평 탭을 구분자로 사용하여 행을 하위 문자열로 분할하고 지정된 루프 변수에 첫 번째 공백/탭 구분 문자열만 할당합니다.I디렉토리 이름에는 공백이 1개 이상 포함될 수 있기 때문에 이 분할 동작은 여기서 원하지 않습니다.따라서 '''는delims=는, 행 해, 변수인 「」에의 빈 합니다.I , , , , , , , , , , , , , , , , , , , , , , , 。

FOR 명령은 경로 없이 각 디렉토리 이름에 대해 RD 명령을 실행합니다. 따라서 RD 명령줄에서 하위 폴더 이름과 연결된 폴더 경로를 다시 지정해야 합니다.

사용된 명령어와 명령어의 작동 방식을 이해하려면 명령 프롬프트 창을 열고 여기서 다음 명령을 실행하여 각 명령에 대해 표시되는 모든 도움말 페이지를 매우 주의 깊게 읽어 보십시오.

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?

파일을 삭제하려면:

del PATH_TO_FILE

모든 파일이 들어 있는 폴더를 삭제하려면:

rmdir /s /q PATH_TO_FOLDER

폴더 자체를 삭제하지 않고 특정 폴더에서 모든 파일을 삭제하는 것은 조금 복잡합니다. del /s *.*폴더를 삭제할 수 없지만 모든 하위 폴더에서 파일을 제거합니다.따라서 다음 두 가지 명령어가 필요합니다.

del /q PATH_TO_FOLDER\*.*
for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i"

다음 명령을 사용하여 모든 컨텐츠와 상위 폴더 자체를 삭제할 수 있습니다.

RMDIR [/S] [/Q] [drive:]path            
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q

이 방법들 중 몇 가지를 시도해 봤지만 제대로 된 방법은 하나도 없었습니다.

Windows Command Line 사이트에서 다음 2단계 방법을 찾았습니다.

forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"

forfiles /P %pathtofolder%  /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"

그것은 내가 필요로 하는 대로, 그리고 OP에 의해 지정된 대로 작동했다.

다음과 같은 솔루션을 사용할 수 있었습니다.

for /R /D %A in (*node_modules*) do rmdir "%A" /S /Q

현재 디렉토리와 하위 폴더에서 모든 노드 모듈 폴더를 제거합니다.

이것은 위에 게재된 솔루션과 비슷하지만, 누군가 도움이 될 수 있도록 아직 여기에 게재하고 있습니다.

용도:

del %pathtofolder%\*.*   /s /f  /q

에 있는 모든 됩니다.%pathtofolder%는 읽기 전용 파일을 포함하며 확인을 요구하지 않습니다.

언급URL : https://stackoverflow.com/questions/1965787/how-to-delete-files-subfolders-in-a-specific-directory-at-the-command-prompt-in

반응형