Mam tego rodzaju drzewo katalogów uzyskane z rozpakowania pliku zip:
x -> y -> z -> run -> PLIKI I DIRECTORIES TUTAJ
Są więc 4 katalogi, z których 3 są puste z plików (x, y, z) i zawierają tylko 1 podkatalog, i jest katalog, który mnie interesuje, o nazwie „ uruchom ”.
Chcę przenieść sam katalog „run” (w tym wszystko wewnątrz) do lokalizacji „root”, w której rozpakowałem (tj. Gdzie jest „x”, ale nie wewnątrz „x”).
Założenia: Nie istnieje folder o nazwie „run”, ale nie wiem, jak wiele katalogów będę musiał „cd”, aby dostać się do niego (może być 3 (x, y, z), może być 10 lub więcej nazw. są również nieznane i nie muszą być x, y, z itp.).
Jak mogę to osiągnąć? Próbowałem wielu odmian tego pytania, ale wszystkie zawiodły.
Odpowiedzi:
co powiesz na
gdzie
(na bocznej notatce jest
--junk-paths
dostępna opcja zip, podczas zipowania lub rozpakowywania)źródło
Zrobiłbym to
bash
za pomocąglobstar
. Jak wyjaśniono wman bash
:Aby przenieść katalog
run
do katalogu najwyższego poziomux
, a następnie usunąć resztę, możesz:shopt
Komenda umożliwiaglobstar
opcję.mv x/**/run/ x/
Ruszy żadnych podkatalogów nazwanychrun
(zauważ, że to działa tylko wtedy, gdy istnieje tylko jedenrun
katalog) dox
ifind
usunie żadnych pustych katalogów.Możesz zrobić wszystko w powłoce z rozszerzonym globowaniem, jeśli chcesz, ale wolę siatkę bezpieczeństwa,
find -empty
aby upewnić się, że żadne niepuste katalogi nie zostaną usunięte. Jeśli Cię to nie obchodzi, możesz użyć:źródło
Zdecydowanie bardziej szczegółowy, ale wykonujący pracę w jednym kroku:
Zakładając, że masz zainstalowany Python
Jak używać
get_folder.py
Uruchom go z katalogiem głównym (zawierającym rozpakowane pliki) i nazwą folderu, aby „podnieść” jako argumenty:
I to jest zrobione:
źródło
Rozwiązanie Perla
Sposób działania jest prosty:
find()
podprogram przejdzie rekurencyjnie do podanego drzewa katalogów, znajdzie katalog o nazwierun
i wrzuci go do tablicy poszukiwanych nazw plików. W tym przypadku zakładamy, że na liście powinien znajdować się tylko jeden plik, dlatego po zakończeniu polecenia korzystamydirmove()
zFile::Copy::Recursive
modułu i przenosimy go do bieżącego katalogu roboczego, z którego został wywołany skrypt. Zatem w twoim przypadku wywołałbyś go z katalogu nadrzędnego dox
.Oryginalne drzewo katalogów:
Wynik:
źródło