다른 하위 디렉터리에 있는 동일한 이름의 폴더 내용 삭제

다른 하위 디렉터리에 있는 동일한 이름의 폴더 내용 삭제

저는 윈도우 10을 사용하고 있습니다.

기본 디렉터리(여기서는 "d:\dir")의 여러 하위 디렉터리에 동일한 이름의 폴더("data"라고 가정)가 많이 있습니다.

자체 삭제 없이 "data"라는 이름의 모든 폴더 내용(파일만 포함)을 삭제하려면 어떻게 해야 합니까?

예를 들어 세 개의 폴더에 대해 다음과 같습니다.

d:\디렉터리\데이터
d:\디렉터리\tmp1\data
d:\디렉터리\tmp3\tmp2\data

답변1

Windows 명령 프롬프트 창 내에서 다음 명령줄을 사용하여 모든 data디렉터리 D:\dir와 해당 하위 디렉터리에 있는 모든 파일(폴더 아님)만 삭제할 수 있습니다.

for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"

동일한 명령줄은 Windows 배치 파일에서 다음과 같이 작성됩니다.

@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"

명령을 위한%ComSpec% /C백그라운드에서 명령줄 로 시작되는 별도의 명령 프로세스에서 실행됩니다 .

dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"

환경 변수는 ComSpec일반적으로 %SystemRoot%\System32\cmd.exe다음에서 볼 수 있는 대로 정의됩니다.체계Windows의 환경 변수제어판 - 시스템 - 고급 시스템 설정 - 환경 변수.... 환경 변수는 SystemRoot기본적으로 Windows 디렉터리 경로로 정의됩니다. 다시 말해서을 위한는 과 사이에 지정된 C:\Windows\System32.exe옵션 /C과 명령줄을 사용하여 대부분의 Windows PC에서 기본적으로 실행됩니다 . 사전 정의된 목록이 포함된 Wikipedia 기사도 참조하세요.('')Windows 환경 변수.

명령디렉터리처리할 출력표준 출력(표준 출력)

  • 옵션으로 인해 기본 형식으로/B
  • 옵션으로 인한 디렉토리 이름 /AD(속성 디렉토리)
  • 옵션으로 인해 전체 경로 포함/S
  • 와일드카드 패턴과 일치*data
  • 지정된 디렉토리에D:\dir
  • option 때문에 모든 하위 디렉터리도 마찬가지입니다 /S.

디렉터리처리할 오류 메시지를 출력합니다.STDERR(표준 오류) 이러한 기준과 일치하는 디렉토리 항목이 없습니다. 이 오류 메시지는 장치로 리디렉션하면 표시되지 않습니다.와 함께 2>nul.

그래서 출력은디렉터리주어진 예는 다음과 같습니다.

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

의 출력디렉터리다루다표준 출력|처리하도록 리디렉션됩니다.STDIN(표준 입력) 다음 명령찾기STR.

찾기STR읽은 스트림에서 검색STDIN한 줄씩

  • 옵션 때문에 대소문자를 구분하지 않음/I
  • 문자 그대로 해석된 문자열\data
  • option 때문에 줄 끝에서 찾아야 합니다 /E.

그래서찾기STR처리할 출력표준 출력백그라운드 명령은 \data주어진 예에 대한 줄 끝의 모든 줄을 다시 처리합니다.

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

명령 출력 필터링디렉터리~와 함께찾기STRMyData다음과 같은 이름을 가진 디렉토리를 제외해야 합니다.디렉터리모든 하위 디렉터리 와 해당 하위 디렉터리를 출력하는 것이 아니라 모든 디렉터리 와 해당 하위 디렉터리를 *출력하는 데 필요한 와일드카드 때문입니다 .D:\dir\datadataD:\dir

다음에 관한 Microsoft 기사를 읽어보세요.명령 리디렉션 연산자 사용2>nul및 에 대한 설명입니다 |. 리디렉션 연산자 >|캐럿 문자를 사용하여 이스케이프해야 합니다 ^.을 위한Windows 명령 해석기가 명령을 실행하기 전에 이 명령줄을 처리할 때 리터럴 문자로 해석되는 명령줄을 위한dir백그라운드에서 시작된 별도의 명령 프로세스에서 포함된 명령줄을 실행합니다 .

을 위한옵션을 사용하면 /F최종적으로 처리할 모든 출력을 캡처합니다.표준 출력시작된 명령 프로세스를 종료하고 시작된 후 이 출력을 한 줄씩 처리합니다 cmd.exe.

빈 줄은 항상 무시됩니다.을 위한, 그러나 다음으로 출력되는 빈 줄은 없습니다.디렉터리그리고찾기STR.

을 위한기본적으로 ;줄 끝 문자인 a로 시작하는 모든 줄도 무시합니다. 하지만 캡처한 모든 라인은을 위한이 경우 모든 줄이 로 시작하므로 세미콜론으로 시작하지 마십시오 D:. 따라서 기본값을 eol=;유지할 수 있습니다. 그렇지 않으면 eol=|일반적으로 파일/폴더 이름에 세로 막대가 포함될 수 없으므로 파일/폴더 이름 목록을 처리하는 것이 가장 좋습니다.

을 위한기본적으로 일반 공백과 가로 탭 문자를 문자열 구분 기호로 사용하여 모든 줄을 하위 문자열로 분할하고 첫 번째 공백/탭으로 구분된 문자열을 지정된 루프 변수에 할당합니다 I. 디렉터리 경로의 폴더 이름에는 data공백 문자가 포함될 수 있습니다. 이러한 이유로 줄 분할 동작을 비활성화하는 빈 구분 기호 목록이 지정되어 항상 발견된 폴더의 전체 이름이 delims=루프 변수에 할당됩니다 .Idata

을 위한명령 에 할당된 모든 data디렉터리 에 대해 실행됩니다.I

del /A /F /Q "%I\*"

%I실행 전에 대체됩니다.현재 루프 변수에 할당된 정규화된 디렉터리 이름으로 I.

명령파일을 삭제하는 것입니다. 디렉터리는 삭제되지 않습니다. 이 옵션은 /A숨겨진 속성이 설정된 파일을 포함하여 해당 속성과 독립적인 모든 파일을 삭제하는 데 사용됩니다.옵션 없이는 삭제되지 않습니다 /A. /F옵션 없이는 삭제되지 않는 읽기 전용 속성이 설정된 파일을 강제로 삭제하려면 이 옵션이 필요합니다 /F. 이 옵션은 /Q일치하는 모든 파일을 *삭제해야 하는지 사용자에게 묻는 쿼리를 억제하는 데 사용됩니다..

정규화된 디렉터리 이름은 큰따옴표로 묶어야 합니다. 왜냐하면 도움말에 설명된 대로 명령의 인수 문자열 주위에 &()[]{}^=;!'+,`~사용해야 하는 공백이나 이러한 문자 중 하나가 포함될 수 있기 때문입니다."명령 명령 프롬프트 창에서 실행할 때 출력되는 마지막 도움말 페이지 cmd /?.

점에 유의하시기 바랍니다사용자가 파일을 삭제할 수 있는 NTFS 권한이 없거나 응용 프로그램에서 열려 있는 동안 파일 삭제를 방지하는 방식으로 현재 응용 프로그램에서 열려 있는 파일은 삭제할 수 없습니다.NTFS 또는 파일 액세스 권한 누락으로 인해 삭제할 수 없는 모든 파일에 대해 오류 메시지를 출력합니다.

사용된 명령과 그 작동 방식을 이해하려면 명령 프롬프트 창을 열고 다음 명령을 실행한 후 각 명령에 대해 표시되는 모든 도움말 페이지를 주의 깊게 읽으십시오.

  • del /?
  • dir /?
  • echo /?
  • findstr /?
  • for /?

답변2

귀하의 예에 따라 다음과 같이 전화해야 합니다.

Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item

답변3

이름이 "data"인 모든 폴더를 반복적으로 열거한 다음 해당 콘텐츠를 삭제합니다.

$base_dir = 'D:\dir'
$name     = 'data'

Get-ChildItem $base_dir -Recurse -Force | Where-Object {
    $_.PSIsContainer -and
    $_.Name -eq $name
} | Select-Object -Expand FullName | ForEach-Object {
    Remove-Item "$_\*" -Recurse -Force
}

PowerShell v3 이상에서는 매개변수를 사용하여 필터 조건을 바꿀 수 $_.PSIsContainer있습니다 .-DirectoryGet-ChildItem

관련 정보