Czy istnieje opcja z poleceniem „ls”, w której widzę tylko katalogi?


73

Czasami muszę sprawdzać tylko katalogi, a nie pliki. Czy jest jakaś opcja z poleceniem ls? Czy jest na to narzędzie?

EDYCJA : Używam Mac OS X i ls -ddaje mi, .mimo że mam katalogi.


4
Czy ktoś może wyjaśnić, dlaczego ls -ddaje tylko .i dlaczego */należy dodać do końca, aby działał?
cwd

3
@cwd Jeśli nie określisz żadnych plików, lsdomyślnie jest to .. I -dśrodki nie wydrukować zawartość katalogu, wydrukuj samego katalogu.
Mikel

1
@cwd spróbuj użyć ls -pto pokazuje /po nazwach katalogów. Więc */to tylko próbka, która jest porównywana z nazwą katalogu i /kombi.
Pitt

Utworzyłem funkcję implementującą odpowiedź @ Steven_D dla mojego pliku ~ / .bash_aliases: gist.github.com/rjurney/998f4951a57bfa5daeb9a6c18f6f4827
rjurney

Odpowiedzi:


84

Wiem, że istnieje już wybrana odpowiedź, ale żądane zachowanie można uzyskać tylko ls:

ls -ld -- */

(Zauważ, że „-” oznacza koniec parametrów, uniemożliwiając interpretację nazw folderów rozpoczynających się od myślnika jako dalszych opcji poleceń).

Spowoduje to wyświetlenie wszystkich nie ukrytych (chyba że skonfigurujesz globusy powłoki, aby je rozwinąć) katalogów w bieżącym katalogu roboczym, w którym jest uruchomiony (pamiętaj, że zawiera również dowiązania symboliczne do katalogów). Aby uzyskać wszystkie podkatalogi innego folderu, po prostu spróbuj:

ls -ld /path/to/directory/*/

Zauważ, że -l jest opcjonalny.


5
Miły. Nigdy nie uważałem, że katalogi mają niejawne znaczenie /na końcu - ale teraz, kiedy widzę, że odpowiadasz, ma to sens. W końcu tab-uzupełnianie zawsze to dodaje.
gvkv

-d for dir, -l for long format. jaki jest cel --?
Dineshkumar

1
Chociaż wygląda to krótko i działa w większości przypadków, nie można stosować tego podejścia, gdy potrzebny jest prawdziwy katalog, a nie dowiązanie symboliczne katalogu. Tak findjest rzeczywiście dobrym wyborem w tej sprawie.
biocyberman

1
findma również tę zaletę, gdy liczba katalogów przekracza maksymalną długość argumentu.
Steven D

Praca w tył, po prostu sobie sprawę, można po prostu zignorować coś z rozszerzeniem: ls -alhF --ignore=*.*. Nie jestem pewien, jak dobrze poradziłoby sobie z „ukrytymi” folderami, tj..myHiddenFolder
Timmah

14

Nie, ale wystarczy proste findpolecenie:

find . -type d -depth 1

lub grep

ls -F | grep /

W razie potrzeby możesz także użyć aliasu.


6
Tak było na Ubuntu 14.04 -maxdepth 1. findChciałem też, abym find . -maxdepth 1 -type d
zmienił

To ls -F | grep /rozwiązanie działa cuda! Wydaje się, że jest to jedyny, który mogę uruchomić na moim komputerze FreeBSD. Myślę, że korzystanie z Fish oznacza, że ​​coś z */może nie działać?
cjm

Nigdy nie pracowałem z Fishem, więc nie jestem tego pewien, ale opcja -F może zdziałać cuda.
gvkv

7

Lubię narzędzie drzewa , aby uzyskać przegląd struktury katalogów. Jest dostępny w MacPorts i we wszystkich dystrybucjach Linuksa, które wypróbowałem.

tree -d -L 2

To pokazuje wszystkie katalogi, głębokie na dwa poziomy.


5

Musiałem także wyświetlić ukryte katalogi, więc zmodyfikowałem powyższą sugestię, aby dopasować ją do moich potrzeb

ls -d -- */ .*/

(w zależności od powłoki, która może również obejmować .i ..)


2

Dzięki zsh(jak domyślnie znajduje się w macOS, nawet /bin/shtam był), użyjesz kwalifikatorów glob, aby wybrać pliki na podstawie ich typu:

  • Wyświetl nie ukryte katalogi:

    ls -d -- *(/)
    
  • Wyświetl wszystkie katalogi:

    ls -d -- *(D/)
    

    ( .i ..zawsze są wykluczone, dodaj je indywidualnie, jeśli chcesz)

  • Uwzględnij także dowiązania symboliczne do katalogów:

    ls -d -- *(D-/)
    

    ( -sprawia, że ​​po rozstrzygnięciu dowiązania symbolicznego obowiązują dalsze kwalifikatory).


-1

Myślę, że ls ma błąd w Mac OS X. Obejściem tego problemu jest użycie grep ... ls -l / | grep "^d"


1
Miło wiedzieć, że nie jestem jedyną osobą, która używa grep "^d"hacka
Michael Mrozek

6
O ile mi wiadomo, zachowanie, które opisuje, nie jest błędem i jest takie samo, jeśli używa się GNU ls. Opcja -d wyświetla listę dla katalogu, a nie zawartość. Aby zobaczyć, dlaczego to może być przydatne, zobacz różnicę między: ls -l /homeals -dl /home
Steven D

Karaty nie są wyjątkowe dla muszli. Możesz po prostu użyć ls -l / | grep ^d. Jeśli zamiar użyć cudzysłowu, ponieważ nie trzeba interpretacji parametrów, ich pojedyncze cytaty. ls -l / | grep '^d'. Tak, jestem pedantem. Ale naprawdę, zrób to. :)
Wildcard

-1
$ ls -p | grep /

-pFlag pozwoli lsdodać ukośnik ( `/ ') po każdym pliku jeśli plik jest katalogiem.


-2

Najprostszym sposobem jest wpisanie następującego polecenia. Działa to na większości platform i wersji UNIX i Linux. Możesz pominąć, -Fjeśli chcesz, ale jest to argument, który dodaje / na końcu nazwy katalogu. -CArgumentem rejestruje tylko nazwy katalogów - wszystkie z nich w bieżącym katalogu. Jeśli chcesz zobaczyć tylko katalogi i podkatalogi w bieżącej ścieżce, po prostu dodaj -Rargument ( ls -CFR).

# ls -CF
/dir1  /dir2  /dir3  /beaches  /Work  /Other 

1
We wszystkich lsimplementacjach znam i w specyfikacji POSIX ls, -Cto do wyjścia w kolumnach , aby nie pominąć pliki spoza katalogu. W twoim przykładzie /są one drukowane przed nazwami plików, czego nie lszrobiłaby żadna implementacja. Dzięki -F, /jest dołączana do nazwy pliku dla plików katalogowych.
Stéphane Chazelas,

Kiedy zobaczyłem tę odpowiedź, zastanawiałem się: „Gdzie to jest prawda?” @ StéphaneChazelas i Jeff Schaller - czy nie krytykujesz rażąco błędnych odpowiedzi?
G-Man

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.