와일드카드 폴더에서 파일을 삭제하는 배치 파일

와일드카드 폴더에서 파일을 삭제하는 배치 파일

여러 디렉터리에서 파일을 삭제하는 배치 파일을 어떻게 만듭니까?

D:\L1\asdasda\L3\*.txt
D:\L1\dfghfghfh\L3\*.txt
D:\L1\tyutyugj\L3\*.txt
D:\L1\ytrtyrty\L3\*.txt

좋다:

D:
del "d:\L1\*\L3\*.txt"

barlop의 메모-질문자가 추가합니다-

나는 약 100개의 디렉토리를 가지고 있습니다. 폴더는 삭제하지 않고 파일만 삭제하고 싶습니다. 이들 모두에는 L3 폴더가 있으며 모두 동일한 확장자를 가진 일부 파일을 포함합니다. 임시 파일일 뿐 자동으로 삭제되지는 않습니다.

답변1

하위 폴더 이름에 와일드카드를 사용하여 동적으로 다른 이름을 가진 하위 폴더에서 삭제하는 배치 파일

와일드카드 폴더에서 파일을 삭제하는 배치 파일

다음은 항상 이러한 유형의 작업을 완료하는 데 사용하는 쉽고 간단한 배치 스크립트 예입니다. 설명된 대로 필요에 맞게 변수 폴더 경로를 연결했습니다.

샘플 배치 스크립트

(변수 루트 폴더와 하위 폴더를 맨 위에 설정하면 논리가 파일 에 대한 명령을 지정하고 완료함에 따라 디렉터리를 순회하는 나머지 마술을 수행하기 위해 루프가 그에 따라 반복됩니다 FOR /D . )FORDEL /Q /F*.txt

@ECHO ON

SET SourceDir=D:\L1
SET SourceSubDir=L3

:: --// note the asterisk wildcard after SourceDir in the first FOR /D loop using X as the variable
:: --// note the X variable appended to the beginning of the second FOR (no /D switch here) loop in the SET part using Y as the variable
FOR /D %%X IN ("%SourceDir%\*") DO FOR %%Y IN ("%%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%%~Y"
GOTO EOF

메모: 명령 프롬프트에서 수동으로 복사하여 붙여넣기를 사용하여 이를 실행하려는 경우 FOR 루프는 모든 부분에서 백분율 기호 중 하나를 제거해야 하므로 배치 스크립트가 아닌 복사 및 붙여넣기를 사용하여 수동으로 실행하고 위의 예가 작동하는 방식으로 실행하는 경우 해당 부분에 대해 아래를 사용하십시오.

FOR /D %X IN ("%SourceDir%\*") DO FOR %Y IN ("%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%~Y"

더 자세한 내용과 연구

(입력 FOR /? 이 세부 정보를 보려면 Windows 명령 프롬프트에서)

FOR(스위치 없음)

Runs a specified command for each file in a set of files.

FOR %variable IN (set) DO command [command-parameters]

  %variable  Specifies a single letter replaceable parameter.
  (set)      Specifies a set of one or more files.  Wildcards may be used.
  command    Specifies the command to carry out for each file.
  command-parameters
             Specifies parameters or switches for the specified command.

To use the FOR command in a batch program, specify %%variable instead
of %variable.  Variable names are case sensitive, so %i is different
from %I.

If Command Extensions are enabled, the following additional
forms of the FOR command are supported:

/D에 대해

FOR /D %variable IN (set) DO command [command-parameters]

    If set contains wildcards, then specifies to match against directory
    names instead of file names.

답변2

\L1\*\L3\* 줄을 해석합니다. As: 주어진 디렉토리 L1에 대해 하위 디렉토리 L3이 있는 모든 하위 디렉토리를 찾고 그 안에 있는 모든 파일을 삭제합니다.

디렉토리 구조를 탐색하려면 스크립트를 작성해야 합니다. 디렉터리나 파일 목록을 가져온 다음 반복 작업을 수행하는 방법이 있는 Perl이나 powershell을 사용해야 할 수도 있는 배치 파일로는 쉽게 수행할 수 없습니다.

의사 코드에서

Get list directories
For each dir 
  Cd into it
  Check if The dir L3 exists
  If it does then del .\L3\*.* 
  Go back up a level
Next dir

차이점을 확인하기 위해 Powershell에서 다시 실행할 생각이지만 이것에 대해 생각하고 배치 파일 코드에서 이 작업을 수행했습니다.

알았어 생각해 봤어

이 배치 파일은 실행되는 디렉토리 구조를 탐색하고 이름이 "L3"인 디렉토리의 내용을 삭제합니다.

@echo off
for /r %%d in (*) do call :process "%%d"
goto :eof

:process
pushd "%~dp1"
for /f "delims=" %%A in ('cd') do (
     set foldername=%%~nxA
    )
if "%foldername%"=="L3" del/q *.*
popd
goto :eof

더 간단하게 만드는 것이 가능할 수도 있지만 현재 디렉터리 이름만 가져오는 작업은 지저분합니다(프로세스 섹션의 for 루프).

디렉토리가 다음과 같이 시작되면

└───L1
    │   1.dat
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    │           c.dat
    │           d.dat
    ├───Bob
    │       6.dat
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    │           a.dat
    │           b.dat
    └───Ted
            6.dat

cleantree를 실행하면 다음과 같이 보일 것입니다.

└───L1
    │   1.dat
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    ├───Bob
    │       6.dat
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    └───Ted
            6.dat

답변3

for /f %G in ('dir /ad /b D:\L1\') do del D:\L1\%G\L3\*.txt

for /f세트의 모든 파일에 대해 다음 do 명령을 실행합니다.

%G in ('dir /ad /b D:\L1\')주어진 디렉토리 내의 각 폴더에 대한 기본 형식으로 설정된 변수

디렉토리에 대해 설정된 %G 값 및 와일드카드를 사용하는 삭제 명령


테스트 실행 먼저

실제로 실행하지 않고 명령을 테스트하기 위해 실행할 명령을 콘솔에 인쇄하려면 echo를 사용하여 실행하세요.

for /f %G in ('dir /ad /b D:\L1\') do echo del D:\L1\%G\L3\*.txt

관련 정보