Ich habe diese Art von Verzeichnisbaum, der durch Entpacken einer Zip-Datei erhalten wird:
x -> y -> z -> run -> DATEIEN UND VERZEICHNISSE HIER
Es gibt also 4 Verzeichnisse, von denen 3 keine Dateien (x, y, z) enthalten und nur 1 Unterverzeichnis enthalten, und es gibt das Verzeichnis, an dem ich interessiert bin, mit dem Namen " run ".
Ich möchte das "run" -Verzeichnis selbst (einschließlich aller darin enthaltenen) an den "root" -Standort verschieben, an dem ich es entpackt habe (dh wo "x" ist, aber nicht innerhalb von "x").
Annahmen: Es gibt einen Ordner mit dem Namen "run", aber ich weiß nicht, wie viele Verzeichnisse ich "cd" haben muss, um dorthin zu gelangen (könnte 3 (x, y, z) sein, könnte 10 oder mehr sein. Die Namen sind ebenfalls unbekannt und müssen nicht x, y, z usw. sein.
Wie kann ich das erreichen? Ich habe viele Variationen dieser Frage ausprobiert , aber alle sind gescheitert.
Antworten:
wie wäre es mit
wo
(
--junk-paths
Nebenbei bemerkt gibt es eine Option in zip, entweder beim Zippen oder beim Entpacken)quelle
Ich würde dies in tun
bash
, mitglobstar
. Wie erklärt inman bash
:Um das Verzeichnis
run
in das Verzeichnis der obersten Ebene zu verschiebenx
und den Rest zu löschen, haben Sie folgende Möglichkeiten:Der
shopt
Befehl aktiviert dieglobstar
Option. Dasmv x/**/run/ x/
verschiebt alle benannten Unterverzeichnisserun
(beachten Sie, dass dies nur funktioniert, wenn es nur einrun
Verzeichnis gibt) inx
undfind
löscht alle leeren Verzeichnisse.Wenn Sie möchten, können Sie das Ganze in der Shell mit erweitertem Globbing ausführen, aber ich bevorzuge das Sicherheitsnetz
find -empty
, um sicherzustellen, dass keine nicht leeren Verzeichnisse gelöscht werden. Wenn Sie sich nicht darum kümmern, können Sie Folgendes verwenden:quelle
Auf jeden Fall ausführlicher, aber die Arbeit in einem Schritt erledigen:
Angenommen, Sie haben Python installiert
Wie benutzt man
get_folder.py
Führen Sie es mit dem Stammverzeichnis (das Ihre entpackten Inhalte enthält) und dem Namen des Ordners aus, der als Argumente "angehoben" werden soll:
Und es ist geschafft:
quelle
Perl-Lösung
Die Funktionsweise ist einfach: Die
find()
Subroutine durchläuft den angegebenen Verzeichnisbaum rekursiv, sucht das Verzeichnis mit dem Namenrun
und verschiebt es in ein Array gewünschter Dateinamen. In diesem Fall wird davon ausgegangen, dass nur eine Datei in der Liste enthalten sein sollte. Sobald der Befehl abgeschlossen ist, verwenden wir ihndirmove()
vomFile::Copy::Recursive
Modul und verschieben ihn in das aktuelle Arbeitsverzeichnis, aus dem das Skript aufgerufen wurde. In Ihrem Fall würden Sie es also vom übergeordneten Verzeichnis nach aufrufenx
.Ursprünglicher Verzeichnisbaum:
Ergebnis:
quelle