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