동일한 디렉터리 이름을 가진 하위 디렉터리의 파일을 상대 상위/상위 디렉터리로 이동하는 방법은 무엇입니까?

동일한 디렉터리 이름을 가진 하위 디렉터리의 파일을 상대 상위/상위 디렉터리로 이동하는 방법은 무엇입니까?

따라서 다음과 같은 디렉토리 구조가 있습니다.

parent/
└── sub1
|    └── sub1.1
|    |    └── source
|    |        └── something1
|    |        └── something2
|    |   
|    └── sub1.2
|         └── source
|             └── something3
|             └── something4
└── sub2
    └── sub2.1
    |    └── source
    |        └── something5
    |        └── something6
    |   
    └── sub2.2
    |     └── source
    |         └── something7
    |         └── something8
    |   
    └── sub2.3
          └── source
              └── something9
              └── something10

source라는 이름의 모든 디렉터리에서 상대 상위/상위 디렉터리로 모든 파일(파일 이름이 다름)을 이동하고 싶습니다. 따라서 결과는 다음과 같아야 합니다.

parent/
└── sub1
|    └── sub1.1
|    |        └── something1
|    |        └── something2
|    |   
|    └── sub1.2
|             └── something3
|             └── something4
└── sub2
    └── sub2.1
    |        └── something5
    |        └── something6
    |   
    └── sub2.2
    |         └── something7
    |         └── something8
    |   
    └── sub2.3
             └── something9
             └── something10

Linux 예제가 있지만 배치 버전을 따릅니다.

편집: 감사합니다. 작동할 것 같습니다. 원래는 아래가 있었지만 하나의 하위 폴더만 수행합니다.

@echo off
for /D %%I in ("%~dp0*") do (
    if exist "%%I\source\*" (
        move /Y "%%I\source\*" "%%I\" 2>nul
        rd "%%I\source" 2>nul
    )
)

답변1

다음은 작은 C# 프로그램입니다.

using System;
using System.IO;

namespace Move {
class Program {
    static void Main(string[] args) {
        Console.Write("Folder: ");
        string path = Console.ReadLine();

        foreach (var folders in Directory.GetDirectories(path)) {
            Console.WriteLine(folders);

            foreach (var subs in Directory.GetDirectories(folders)) {
                Console.WriteLine($"\t{subs}");

                foreach (var source in Directory.GetDirectories(subs)) {
                    Console.WriteLine($"\t\t{source}");

                    foreach (var item in Directory.GetFiles(source)) {
                        Console.WriteLine($"\t\t\t{item}");

                        string filename = Path.GetFileName(item);

                        string newPath = $@"{subs}\{filename}";
                        File.Move(item, newPath);
                    }

                        Directory.Delete(source);
                    }
                }

            }


            Console.ReadLine();
        }
    }
}

관련 정보