Czy istnieje poprawny sposób wylistowania podkatalogów bieżącego katalogu?

10

Mogę znaleźć podkatalogi katalogu według

ls -d -- */

lub

ls -l | grep "^d"

ale oba wydają się pośrednie i wyobrażam sobie, że istnieje standardowy sposób na znalezienie tylko katalogów. Czy jest na to właściwy sposób? A jeśli nie, to czy którekolwiek z nich doprowadzą do niepożądanych zachowań w przypadkach skrajnych? (Linki symboliczne, ukryte katalogi itp.)

Eric Wilson
źródło

Odpowiedzi:

17

Odpowiedź będzie zależeć bardziej od tego, co zamierzasz zrobić z wyjściem, niż od tego, czego szukasz. Jeśli chcesz tylko zobaczyć listę dla wizualnego odniesienia na terminalu, twoje pierwsze rozwiązanie jest całkiem fajne. Jeśli chcesz przetworzyć dane wyjściowe, powinieneś rozważyć użycie innej metody.

Jednym z najsolidniejszych sposobów na uzyskanie listy do innego programu jest użycie find.

find -maxdepth 1 -type d

Powodem tego jest dobra findtransmisja danych, która może wyprowadzać dane oddzielone wartościami null za pomocą -print0lub odpowiednio unikać ciągów znaków jako argumentów dla innych programów używających -exec. Aby dowiedzieć się, dlaczego jest to lepsze niż analizowanie danych wyjściowych ls, zobacz ParsingLS na Wiki Grega.

Caleb
źródło
4
Musiałem napisać, żeby find . -maxdepth 1 -type dto działało na OS X Yosemite.
Sean Levin
1
aby wyświetlić listę podkatalogów, należy również podać -mindepth jak w find . -maxdepth 1 -mindepth 1 -type d. W przeciwnym razie bieżący katalog .zostanie dołączony.
tinlyx
5

FYI - W ZSH (ale nie BASH), można też to zrobić: ls -d -- *(/); modyfikator mówi zsh tylko do katalogów glob.(/)

To powiedziawszy, nie różni się bardzo od proponowanego przez Ciebie rozwiązania ( ls -d -- */) i jest dalekie od standardu.

O ile dane wyjściowe ls(które prawdopodobnie różnią się w zależności od innych flag):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2
Curtis F.
źródło
zsh rozszerza gwiazdkę na wszystkie pliki i katalogi, flaga (/) wybiera części tego rozszerzenia, aby ls * (/) również działał, podobnie jak echo * (/) , lub bardziej złośliwie drukuj -l * (/ ) . Dwie pierwsze wersje również działają w trybie bash.
Thor
1
Zauważ, że *(/)rozwija się do nie ukrytych katalogów, podczas gdy */rozwija się do nie ukrytych katalogów lub dowiązań symbolicznych do katalogów (lub przynajmniej dowiązań symbolicznych do ścieżek, dla których możemy stwierdzić, że są to katalogi).
Stéphane Chazelas