Wie verschiebe ich alle Unterverzeichnisse in das aktuelle Verzeichnis?

Wie verschiebe ich alle Unterverzeichnisse in das aktuelle Verzeichnis?

Ich bin neu in der Shell-Skript-Programmierung. Angenommen, wir haben eine Dateihierarchie wie diese:

/A/B/C/D
/A/B/E/F/G
/A/H/I
/A/H/J/K

Beachten Sie, dass wir hier nicht nur haben /A/B/.., sondern auch /A/H/.... Alle Buchstaben sind Verzeichnisse. Wir möchten die Hierarchie wie folgt umwandeln:

/A/B/C
/A/B/D
/A/B/E
/A/B/F
/A/B/G
/A/H/I
/A/H/J
/A/H/K

Das heißt, alle Verzeichnisse mit einer Tiefe größer als zwei (Verzeichnis A hat eine Tiefe von null) auf eine Tiefe von zwei zu verschieben. Ich kann JAVA und C verwenden, um dies umzusetzen, aber sie sind etwas zu langsam. Weiß jemand, wie man dies mit einem Shell-Skript umsetzt?

Der Pseudocode lautet wie folgt:

for each directory D in current directory A // A may have more than one subdirectories
    for each directory d in D
        for each object in d
            if object is a directory
                move object and all descendant subdirectories of object to /A/D;
            end if
        end for
    end for
end for

Antwort1

for dir in /A/*; do
    find "$dir" -mindepth 2 -depth -type d -exec mv -t "$dir" -- {} +
done

Dies weist an, findnach allen Verzeichnissen ( -type d) zu suchen, die sich mindestens 2 Ebenen darunter ( -mindepth 2) befinden und dabei $dirdie Tiefensuche ( -depth) durchzuführen. Für jedes gefundene Objekt führt es aus mv -t "$dir" -- <SRC>. Wie immer mvkönnen Sie ein Quellverzeichnis nicht mit einem vorhandenen Zielverzeichnis zusammenführen (es gibt jedoch Möglichkeiten, dies zu umgehen).

verwandte Informationen