Wie verschiebe ich Dateien aus Unterverzeichnissen mit demselben Verzeichnisnamen in das relativ übergeordnete Verzeichnis?

Wie verschiebe ich Dateien aus Unterverzeichnissen mit demselben Verzeichnisnamen in das relativ übergeordnete Verzeichnis?

Ich habe also eine Verzeichnisstruktur wie diese:

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

Ich möchte alle Dateien (mit unterschiedlichem Dateinamen) aus allen Verzeichnissen mit dem Namen „source“ in das relativ übergeordnete/übergeordnete Verzeichnis verschieben. Das Ergebnis sollte also ungefähr so ​​aussehen:

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

Es gibt ein Linux-Beispiel, aber ich suche nach einer Batch-Version.

EDIT: Danke, das sollte funktionieren. Ich hatte ursprünglich das Folgende, aber es funktioniert nur bis zu einem Unterordner.

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

Antwort1

Hier ist ein kleines C#-Programm.

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();
        }
    }
}

verwandte Informationen