Wiem, że mogę to zrobić, aby uzyskać listę nazw katalogów:
find . -type d -maxdepth 1
Dane wyjściowe wyglądają następująco:
.
./foo
./bar
Wolę wpis bez ./
. Czy istnieje sposób, aby znaleźć, aby wyświetlać tylko surowe nazwy?
Próbowałem wysłać listę do statystyki, aby ją sformatować, ale to daje mi ten sam wynik:
find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'
foo bar ...
wszystko na jednej linii bez./
frontu?Odpowiedzi:
W GNU
find
możesz użyć-printf
opcji:Jak zauważył Paweł w komentarzach, jeśli nie chcesz, aby bieżący katalog był na liście, dodaj
-mindepth 1
np .:źródło
-printf
opcji w najnowszej specyfikacji POSIX i zastanawiam się, jak przenośna jest ...printf
opcji nie jest wymieniona przez POSIX i wydaje się, że nie są obsługiwane przez niektóre innefind
wersje. GNU find można zainstalować w większości miejsc, więc w tym sensie jest przenośny.-mindepth 1
jeśli chcesz się pozbyć.
Aktualizacja:
Krótsza alternatywa:
Podadzą ci nazwy, po jednej w wierszu, bez żadnych ukośników
źródło
ls
. W tym samym czasie zamieściłem link, dlaczego jest to zły pomysł na inną odpowiedź, która została usunięta. W tym czasie były tylko 2 odpowiedzi, a powód wydawał się oczywisty. Cieszę się, że zwróciłeś uwagę na dwuznaczność, a oto moje wyjaśnienie. Dla przypomnienia, oddałem głos w głosowaniu pozytywnym, ponieważ zgadzam się z twoją obecną odpowiedzią.\n
w nazwie katalogu znajduje się nazwa, której nie możesz użyć do jej odzyskania (co robiłeś, kiedy cię oceniłem). Jest kilka przypadków, w którychls
nie zachowuje się niebezpiecznie i prawie zawsze bezpieczniej jest użyć innego sposobu.Korzystając z GNU find, możesz użyć -mindepth, aby zapobiec dopasowaniu find do bieżącego katalogu:
Ponieważ nie robisz tego rekurencyjnie, możesz użyć globu bash:
Dodanie trailing / do globu spowoduje dopasowanie tylko katalogów.
źródło
*/
brakuje plików kropek i zawiera dowiązania symboliczne. To może, ale nie musi stanowić problemu.Pozwól
sed
usunąć te dwa znaki:źródło
Wolałbym użyć:
źródło
Zwykle używam:
Ale nie wiem, czy to właściwy sposób na robienie tego, co chcesz.
źródło
echo */
zrobiłby to samo, mniej więcej (pomija pliki kropek i zawiera dowiązania symboliczne), ale wtedy joachim pyta, jak usunąć finał/
.W systemie AIX parametr „maxdepth” nie działa.
Ogólnie rzecz biorąc, działa to dla mnie:
find ./ -type d | cut -d"/" -f2 | sort -u
źródło
To, czego szukasz, nazywa się
basename
, ignoruje strukturę katalogów unixPrzykład poniżej:
find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;
wykluczy dla danych wyjściowych nawet ścieżkę katalogu, usuwając konieczność
cd
przed uruchomieniem poleceniaNiektóre dodatkowe informacje:
Podałbym
-exec
jako argument, aby zamiast tego znaleźć|
(potok) inną komendę dla danych wyjściowych (unikając drugiej komendy przechodzącej przez każdą linię wyjściową, mówiąc, że w zależności od danych wyjściowych może poprawić wydajność skryptu)UWAGA:
find
opcje nie są pozycjonowane (-maxdepth wpływa na testy określone przed nim, a także testy określone po nim).źródło