2014-12-24 9 views
6

Potrzebuję pomocy .....BASH - Tylko drukowanie najgłębszego katalogu w ścieżce

W moim pliku .bashrc Mam bardzo przydatnych funkcji (może być nieco szorstki i gotowy, a nieco hacky , ale działa jak leczy!), który odczytuje plik wejściowy i używa funkcji "drzewo" na każdej z linii wejściowych do utworzenia drzewa katalogów. to drzewo jest następnie drukowane do pliku wyjściowego (wraz z rozmiarem folderu).

multitree() 
{ 
    while read cheese 
    do 
     pushd . > /dev/null 
     pushd $cheese > /dev/null 
     echo -e "$cheese \n\n" >> ~/Desktop/$2.txt 
     tree -idf . >> ~/Desktop/$2.txt 
     echo -e "\n\n\n" >> ~/Desktop/$2.txt 
     du -sh --si >> ~/Desktop/$2.txt 
     echo -e "\n\n\n\n\n\n\n" >> ~/Desktop/$2.txt 
     popd > /dev/null 
    done < $1 
     cat ~/done 
} 

to oszczędność czasu jak bez końca, a na wyjściu fragment jak następuje:

./foo 
./foo/bar 
./foo/bar/1 
./foo/bar/1/2 

itd itp ....

jednak pierwszym (i najbardziej uciążliwe) rzeczą, którą muszę zrobić, to usunąć wszystkie wpisy pozostawiając tylko najgłębszą ścieżkę folderu (przy użyciu powyższego przykładu zostanie ona zredukowana do just ./foo/bar/1/2)

Czy istnieje sposób przetwarzania pliku wcześniej/po drzewie funkcja drukowania tylko najgłębszych poziomów?

Wiem, że coś w stylu Pythona może zrobić lepszą robotę, ale moim problemem jest to, że nigdy nie użyłem Pythona I nie jestem pewien, czy systemy robocze pozwoliłyby mi uruchomić pythona ... pozwalają nam modyfikować nasze własne .bashrc więc nie martwię się zbytnio!

Z góry dzięki chłopaki !!!!

Owen.

Odpowiedz

15

Można użyć

find . -type d -links 2 

Wymień . z katalogu w razie potrzeby.

EDIT: Objaśnienie:

find przeszukuje katalog dla plików pasujących do danego filtru. W tym przypadku katalog to ., a filtr to -type d -links 2.

-type d filtry do katalogów

-links 2 Filtry do tych, które mają dwie (hard) linki do ich nazwy. Skutecznie, to filtruje dla wszystkich katalogów, które nie mają podkatalogów, ponieważ tylko one mają dwa: Ten w ich katalogu nadrzędnym i link . same w sobie. Osoby posiadające podkatalogi mają również odnośniki .. w swoich podkatalogach.

+0

Być może będziesz musiał mi to wytłumaczyć ....... spojrzałem na stronę Znajdź, ale to nie pomogło mi zrozumieć, co masz na myśli ... –

+0

Edytowałem trochę. Jednak nie ma wiele do wyjaśnienia. – Wintermute

+0

'znaleźć. -linki 2' nie wystarczą. Spróbuj po 'touch ./abcd; ln ./abcd./pqrs' Uwaga: 'ln', nie' ln -s' ... Ale +1 dla tej informacji :-) – anishsane

2

Oto podpowiedź:

Wystarczy policzyć „/” znaków w każdej linii.

Jeśli aktualny wiersz ma mniej niż liczba znaków "/" w poprzednim wierszu, poprzedni wiersz będzie "najgłębszym" katalogiem w jego części hierarchii.

Ten wiersz i każda kolejna linia z jeszcze mniejszymi znakami "/" NIE byłaby najgłębszym katalogiem w swojej części całej hierarchii katalogów. Jak tylko otrzymasz linię o tej samej liczbie znaków "/" lub większej, możesz "zresetować" i znowu mieć oko na pierwszą linię z mniejszą liczbą znaków "/".

I wreszcie, musisz poradzić sobie z trywialnym przypadkiem: tylko jedna linia w wynikach drzewa, bieżący katalog nie ma podkatalogów, więc wygrywa domyślnie.

Innym sposobem można zaimplementować to rozważając następujące oświadczenie:

Jeśli nazwa katalogu jest również istnieje jako dokładnym prefiksem innego katalogu na liście, a następnie znak „/”, to nie jest najgłębszy katalog w swojej części hierarchii.

+0

Cześć, dzięki! ale jak by to działało z wieloma podkatalogami? Chciałbym najgłębszy poziom dla każdego podkatalogu ... zaczynając wierzyć, że nie jest to możliwe ... –

+0

Biorąc pod uwagę następującą listę katalogów: ./one, ./one/subdir, ./two, ./two/subdir , czy możesz wyjaśnić, dlaczego uważasz, że jedna z moich dwóch sugestii nie rozpozna tych dwóch podkatalogów, prawda? –

Powiązane problemy