프로그래밍 방식으로 Windows에서 여러 폴더의 중첩을 어떻게 해제합니까?

프로그래밍 방식으로 Windows에서 여러 폴더의 중첩을 어떻게 해제합니까?

따라서 다음과 같은 일부 다운로드가 포함된 폴더 구조가 있습니다. (질문과 관련이 없는 일부 민감한 데이터가 포함되어 있기 때문에 수동으로 약간 편집했습니다. 확장자도 일반적이지 않으며 관련도 없습니다.)

C:.
│   [FILENAME].[ext]
├───Example 1
│   └───Example 1
│       └───Example 1
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   
│           └───Folder.[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   [FILENAME].[ext]
│               │   
│               ├───test1
│               │       [FILENAME].[ext]
│               │       [FILENAME].[ext]
│               │       
│               ├───test10
│               │       [FILENAME].[ext]
│               │       [FILENAME].[ext]
│               │       
│               ├───test11
│               │       [FILENAME].[ext]
│               │       [FILENAME].[ext]
│               │       
│               ├───test12
│               │       [FILENAME].[ext]
│               │       [FILENAME].[ext]
│               │       
│               ├───test2
│                       [FILENAME].[ext]
│                       [FILENAME].[ext]
├───Example 2
│   └───Example 2
│       └───Example 2
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   
│           ├───Folder.[ext]
│           │       [FILENAME].[ext]
│           │       [FILENAME].[ext]
│           │       [FILENAME].[ext]
│           │       [FILENAME].[ext]
│           │       
│           └───Setup
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
├───Example 3
│   └───Example 3
│       └───Example 3
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   
│           └───Folder.[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
├───Example 4
│   └───Example 4
│       └───Example 4
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   [FILENAME].[ext]
│           │   
│           └───Folder.[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]
│                   [FILENAME].[ext]

                             .
                             .
                             .

보시다시피 실제 파일 사이에 불필요한 폴더가 많이 있습니다.

일괄 처리를 사용하여 "중간 폴더"를 프로그래밍 방식으로 제거할 수 있습니까? 기본적으로 폴더만 포함된 폴더를 모두 제거하고 하위 콘텐츠를 한 수준 위로 가져오고 싶습니다. 어떻게 수행할 수 있습니까(기본 제공 Windows 도구만 사용하는 것이 바람직함)?

이 작은 발췌문에서는 단순히 처음 두 개의 상위 "예제 #" 폴더를 제거하면 모든 문제가 해결되지만 중첩 깊이는 때때로 위아래로 다양합니다. 폴더에 폴더가 하나만 포함되어 있는 경우, 실제 파일(또는 실제 조직을 의미하는 폴더가 두 개 이상)이 있는 경우 제거하고 싶은 것은 "중개자"입니다.

감사합니다!

편집: 나는 삼중(때때로 다른 깊이) 중첩을 제거하여 이와 같은 것을 달성하려고 합니다.

C:.
├───Example 1
│    │   [FILENAME].[ext]
│    │   [FILENAME].[ext]
       .
       .
       .

답변1

~ 안에파워셸, 간단한 재귀 함수로 파일이 포함된 첫 번째 하위 폴더를 찾을 수 있습니다. 그런 다음 해당 폴더의 콘텐츠를 최상위 컨테이너로 이동할 수 있습니다. 이후에는 빈 폴더를 삭제할 수 있습니다. $Top폴더 경로를 반영하도록 편집하세요 .

$Top = 'c:\TopFolder'
Function Get-NonEmptyPath ($FPath) {
   If ( -not (gci -LiteralPath $FPath -file) ) {
      $Return = Get-NonEmptyPath ( gci -LiteralPath $FPath -Directory  ).FullName
   } Else { $Return = $FPath }
   $Return
}

Filter Get-LiteralPath { $_ | Select  @{ N='LiteralPath'; E={ $_.FullName }}}

( Get-ChildItem $Top -Directory ).FullName  | ForEach{
   If (( $Buried = Get-NonEmptyPath $_ ) -ne $null ) {
      gci -LiteralPath $Buried | Get-LiteralPath | Move-Item -Destination $_
      For ( $Empty = $Buried ; $Empty -ne $_ ; ( $Empty = Split-Path -LiteralPath $Empty )) {
         Remove-Item -LiteralPath $Empty
      }
   }
}

편집 후 $Top전체 블록을파워셸콘솔 창.

gci/Get-ChildItem

각각

대한에 대하여

이동 항목

분할 경로

제거 항목

관련 정보