배치 파일을 사용하여 특정 유형 (확장자)의 모든 파일을 디렉토리 아래로 재귀 적으로 삭제합니다.


84

dir1 및 dir2의 모든 .jpg 및 .txt 파일 (예 :)을 삭제해야합니다.

내가 시도한 것은 :

@echo off
FOR %%p IN (C:\testFolder D:\testFolder) DO FOR %%t IN (*.jpg *.txt) DO del /s %%p\%%t

일부 디렉토리에서는 작동했습니다. 다른 사람들에서는 그렇지 않았습니다.

예를 들어, 이것은 아무것도하지 않았습니다.

@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

두 번째 스 니펫에서 내가 무엇을 놓치고 있습니까? 왜 작동하지 않았습니까?


정확히 "작동하지 않는" 방법에 대한 자세한 정보를 제공하면 도움이 될 것 입니다. 실제 결과는 예상 결과와 어떻게 다릅니 까? 오류 메시지가 표시됩니까? 어느?
Ansgar Wiechers

답변:


202

del명령 과 함께 와일드 카드를 사용 /S하여 재귀 적으로 수행 할 수 있습니다.

del /S *.jpg

추가

@BmyGuest는 왜 비추천 답변 ( del /s c:\*.blaawbg)이 내 답변과 다른지 물었습니다 .

있다 거대한 실행의 차이 del /S *.jpg와는 del /S C:\*.jpg. 첫 번째 명령은 현재 위치에서 실행되고 두 번째 명령은 전체 드라이브에서 실행 됩니다 .

jpg두 번째 명령을 사용하여 파일 을 삭제하는 시나리오에서 일부 응용 프로그램이 작동을 멈출 수 있으며 결국 모든 가족 사진을 잃게됩니다. 이것은 매우 성가신 일이지만 컴퓨터는 계속 실행할 수 있습니다.

그러나 일부 프로젝트에서 작업 중이고에서 모든 dll파일 을 삭제 myProject\dll하고 다음 배치 파일을 실행하려는 경우 :

@echo off

REM This short script will only remove dlls from my project... or will it?

cd \myProject\dll
del /S /Q C:\*.dll

그런 다음 드라이브에서 모든 dll파일 을 제거합니다 C:\. 모든 응용 프로그램이 작동을 멈추고 컴퓨터가 쓸모 없게되며 다음 재부팅시 영원히 갇혀있는 4 차원으로 순간 이동됩니다.

여기서 교훈은 그러한 명령 %windir%을 피할 수있는 경우 드라이브의 루트 (또는 위험 할 수있는 다른 위치 (예 :))에서 직접 실행 하지 않는 것입니다. 항상 가능한 한 로컬에서 실행하십시오.


3
pause끝에 줄 을 추가 하면 사용자가 전체 로그 정보를 볼 수 있습니다.
KNU

2
부록에 감사드립니다, Laf. 다른 사람들이이 중요한 차이점을 발견하는 데 도움이 될 것이라고 생각합니다.
BmyGuest

누군가 특정 디렉토리에서 삭제하고 싶다면 `& '와 결합 cd하여 del명령 할 수 있습니다. stackoverflow.com/q/8055371/7429464
FindOutIslamNow

@FindOutIslamNow 또는 del현재 디렉터리를 변경하지 않고도 명령에 전체 경로를 지정할 수 있습니다 .
Laf

이것에 대한 작은주의 사항-삭제할 파일이 없으면 오류가 발생합니다.
Jamie Marshall

4

얼마 전에 삭제할 파일 확장자를 선택할 수있는 배치 스크립트를 작성했습니다. 스크립트는 해당 확장자를 가진 모든 파일에 대한 폴더와 모든 하위 폴더를 찾아 삭제합니다.

@ECHO OFF
CLS

SET found=0
ECHO Enter the file extension you want to delete...
SET /p ext="> "

IF EXIST *.%ext% (           rem Check if there are any in the current folder :)
  DEL *.%ext%
  SET found=1
)
FOR /D /R %%G IN ("*") DO (  rem Iterate through all subfolders
  IF EXIST %%G CD %%G
  IF EXIST *.%ext% (
    DEL *.%ext%
    SET found=1
  )
)

IF %found%==1 (
  ECHO.
  ECHO Deleted all .%ext% files.
  ECHO.
) ELSE (
  ECHO.
  ECHO There were no .%ext% files.
  ECHO Nothing has been deleted.
  ECHO.
)

PAUSE
EXIT

이것이 원하는 모든 사람에게 유용하기를 바랍니다. :)


또는 Bash가 설치되어있는 경우 (Cygwin, WSL 등) 간단한 find . -name "*.ext" -type f -delete(ext는 선택한 확장)이 수행됩니다.
Pyroglyph

3

이를 사용하여 폴더 및 하위 폴더 내의 모든 파일을 삭제할 수 있습니다.

DEL "C:\Folder\*.*" /S /Q

또는 이것을 사용하여 특정 파일 유형 만 삭제합니다.

DEL "C:\Folder\*.mp4" /S /Q 
DEL "C:\Folder\*.dat" /S /Q 

0

댓글을 달 수있는 평판이 부족해서 답변으로 올렸습니다. 그러나이 명령의 원래 문제는 다음과 같습니다.

@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

첫 번째 For는 재귀 구문이 부족하며 다음과 같아야합니다.

@echo off
FOR /R %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

다음과 같이 할 수 있습니다.

FOR %%p IN (C:\Users\0300092544\Downloads\Ces_Sce_600) DO @ECHO %%p

실제 출력을 표시합니다.


0

이거 야:

@echo off

:: del_ext
call :del_ext "*.txt"
call :del_ext "*.png"
call :del_ext "*.jpg"

:: funcion del_ext
@echo off
pause
goto:eof
:del_ext
 set del_ext=%1
 del /f /q "folder_path\%del_ext%"
goto:eof

pd : folder_path를 폴더로 바꿉니다.


-11

C : 드라이브에서 특정. 확장자를 삭제하려는 경우 다음 cmd를 사용하십시오.

del /s c:\*.blaawbg

암호화 바이러스에 감염된 고객이 있는데 모든 정크 파일을 찾아서 삭제해야했습니다.


13
이것은 끔찍하게 안전하지 않은 것 같습니다.
dudewad 2015-04-27

5
이 답변 (-2 표)과 수락 된 답변 (+42 표)의 주요 차이점은 무엇입니까?
BmyGuest

6
@BmyGuest 주요 차이점은 하위 폴더 어딘가에서 내 명령을 실행하면이 하위 폴더 아래에있는 파일에만 영향을 미친다는 것입니다. 이 대답에서는 전체 드라이브에서 파일 이름과 일치하는 모든 것을 삭제 합니다. 따라서 프로젝트에서 일부 dll 파일을 삭제하고 싶을 때 실수로을 입력 del /s c:\*.dll하면 매우 놀랍습니다. 절대적으로 필요한 경우가 아니면 전체 드라이브에서 이러한 명령을 실행 하지 마십시오 .
Laf

2
나는이 대답이 그렇게 많은 반대표를받을 가치가 없다고 생각합니다. 대답은이 명령이 전체 드라이브에 대한 것이며 그 이유를 설명합니다. c:전체 드라이브를 원하지 않는 경우 원하는 폴더로 교체해야합니다.
user1527152

2
나는 그것이하지 말아야 할 것에 대한 면책 ​​조항과 경고 역할을하는만큼 더 많지는 않더라도 많은 반대표가 필요하다고 생각한다. 이와 같은 코드를 복사하고, 붙여넣고, 실행함으로써 정말 일을 망칠 수 있습니다. "안전한"방법으로 정확한 수업을 가르치기 위해 bash에 내장 된 많은 부활절 달걀이 있습니다.이 예제는 당신의 하루를 망칠 수 있습니다. 베스트!
jacktrader
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.