Wyświetlanie tylko katalogów w systemie UNIX


219

Chcę wymienić tylko katalogi w określonej ścieżce ( lsnie ma takiej opcji). Czy można to również zrobić za pomocą polecenia w jednej linii?


12
Na przyszłość: Może lepiej są pytania typu unix / linux, które nie są zbyt trudne w programowaniu: unix.stackexchange.com
— echox

Odpowiedzi:


315

Spróbuj ls -d */wyświetlić listę katalogów w bieżącym katalogu


17
Hej, to całkiem sprytne, zawsze do nas przywykłem ls -al | grep '^d'- to jest bardziej zwięzłe.
— paxdiablo

43
dlaczego używać * / ?? proszę wytłumacz!?
— Chandeep,

6
Nie mam odpowiedniego wyjaśnienia, ale wiem, że */wymusza wyświetlanie tylko elementów kończących się ukośnikiem, który w tym przypadku byłby katalogiem, nawet jeśli -Fopcja lsnie byłaby używana. Podobne do zachowania ls *phpi sposobu wyświetlania wszystkich plików kończących się phpw katalogu.
— David Hancock

3
@ user975234 Ktoś zadał podobne pytanie i istnieje całkiem niezłe wyjaśnienie, link
— user1766760

17
Tylko echo */zrobi to samo za
— nr

95

Spróbuj tego:

find . -maxdepth 1 -type d

8
Dla mnie wygląda to tak, jak należy to zrobić. W przeciwieństwie do sugerowanych lsrozwiązań, findponosi wyłączną odpowiedzialność za wykonanie zadania (nie polega na rozszerzaniu symboli wieloznacznych powłoki, co może nakładać ograniczenia). Jest również o wiele bardziej zwięzły.
— Peter

1
Złą rzeczą jest to, że nie działa, jeśli próbujesz przeglądać wyniki, a wyniki mają spacje w nazwach.
— ubiquibacon

2
Ewentualnie, jeśli nie chcą zawierać katalog sama: find * -maxdepth 0 -type d.
— James Ko

@ubiquibacon użyć find„s -print0lub -execopcji.

1
To jest naprawdę wolne, przynajmniej na moim Macu. Wygląda na to, że wykonuje pełne wyszukiwanie rekurencyjne, które findzwykle wykonuje, ale wyświetla tylko foldery na głębokości 1.
— Kara Brightwell

22

Następujące

find * -maxdepth 0 -type d

w zasadzie filtruje rozszerzenie -type dwarunku „*”, tj. wszystkich pozycji w bieżącym katalogu, według warunku.

Zaletą jest to, że dane wyjściowe są takie same ls -1 *, ale tylko w przypadku katalogów, a wpisy nie zaczynają się od kropki


13

Możesz użyć ls -d */lubtree -d

Innym rozwiązaniem byłoby globowanie, ale zależy to od używanej powłoki i obsługiwanego globowania dla katalogów.

Na przykład ZSH:

zsh # ls *(/)

3
Z jakim smakiem Unixa otrzymujesz tree?
— Johnsyweb

na przykład wszystkie główne problemy z linuksem? przepraszam, nie dostaję pytania?
— echox

1
Mam dystrybucję Debiana i treedomyślnie nie jest instalowana (chociaż jest w repozytoriach).
— Stephen Schrauger

1
Oddaj głos, ponieważ uważam, że treepolecenie nie jest rodzimym poleceniem uniksowym (popraw mnie, jeśli się mylę).
— Tiago Cardoso,

10

Ponieważ istnieje wiele sposobów, aby to zrobić, oto kolejny:

tree -d -L 1 -i --noreport
  • -d: katalogi
  • -L: głębokość drzewa (stąd 1, nasz katalog roboczy)
  • -i: bez wcięć, drukuj tylko nazwy
  • --noreport: nie zgłaszaj informacji na końcu listy drzew

I dziękuję za wyjaśnienie przełączników. Przepełnienie stosu dotyczy odpowiedzi. Zawsze doceniam to, że ludzie lubią cię z wyjaśnieniem, a nie „po prostu przeczytaj wpis man!”. <- to nie jest odpowiedź.
— fusion27,

Aby rozpocząć od linii 2 (pomiń linię tylko kropką):tree -d -L 1 -i --noreport | tail -n +2
— adius

Jest to najwyżej ocenione rozwiązanie, które wyświetla miękko połączone katalogi i robi to w użyteczny sposób, pokazując je jako link. Wolę wariant:tree -C -d -L 1 -i --noreport | tail -n+2
— Amnon Harel

9
ls -l | grep '^d'

Możesz utworzyć alias i umieścić go w pliku profilu

alias ld="ls -l| grep '^d'"

1
łącza nie są wyświetlane za pomocą tego polecenia. Link może być plikiem lub katalogiem. Przykład: lrwxrwxrwx 1 root root 21 kwietnia 15 17:38 cron -> / lib / init / upstart-job.
— c-toesca

7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'

☀ znajdź. -maxdepth 1 -typ d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: nie znaleziono pasujących elementów: [^.] *
— Michael Cole

6

Aby wyświetlić listę ls -d */można użyć katalogów w bieżącym katalogu roboczym . Jeśli chcesz wyświetlić ukryte katalogi, użyj tego polecenia ls -d .*/


6

użyj tego, aby uzyskać listę katalogów

ls -d */ | sed -e "s/\///g"

ls -d <ścieżka katalogu niestandardowego> | sed -e „s / \ /// g” nie działa .. jakieś wskazówki?
— Dhwanit,

Dziękuję Ci! Chciałem tylko listy katalogów bez wszystkich uprawnień i to załatwiło sprawę. :)
— codingjeremy

5

find specifiedpath -type d

Jeśli nie chcesz powtarzać się w podkatalogach, możesz to zrobić w zamian:

find specifiedpath -type d -mindepth 1 -maxdepth 1

Zauważ, że .zostaną również wyświetlone katalogi „kropkowe” (których nazwa zaczyna się na ); ale nie specjalne katalogi .ani ... Jeśli nie chcesz katalogów „kropkowych”, możesz je po prostu grepusunąć:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'


1
Głosuj za wzmianką mindeptho pozbyciu się .! 😁
— adius

5

Odpowiedź będzie zależeć od twojej powłoki .

Na zshprzykład możesz wykonać następujące czynności:

echo *(/)

Zostaną wyświetlone wszystkie katalogi w bieżącym katalogu roboczym.

Zobacz man zshexpnpo więcej informacji.

Alternatywnym podejściem byłoby użycie find(1), które powinno działać na większości smaków Uniksa:

find . -maxdepth 1 -type d -print  

find(1)ma wiele zastosowań, więc zdecydowanie polecam man find.


4

Aby to zrobić, możesz użyć treepolecenia z dprzełącznikiem.

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

zobacz man treewięcej informacji.


Nie głosowałem, po prostu miałem to samo pytanie. Wygląda na to, że twoja odpowiedź jest duplikatem echoksów, może dlatego?
— Louis Waweru,

1
@Louis - dzięki, że nawet nie zauważyłem jego wzmianki tree. No cóż, nie miałem zamiaru ukraść niczyich grzmotów.
— slm

głosowanie za wizualizację tego, co robi drzewo
— Andrejs

Wierzę, że opinie są negatywne, ponieważ jest to ta sama odpowiedź, co stackoverflow.com/a/3667405/523742
— Tiago Cardoso

@TiagoCardoso - moje minęło o dwa lata.
— slm

2

Jeśli mam ten katalog:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

Aby uzyskać wszystkie katalogi, użyj -L do rozwiązania linków:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Bez -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Brakuje katalogu conf_nagios .


2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"

1

To działało dla mnie:

`ls -F | grep /`

(Ale przechodzę na, echo */jak wspomniano @nos)


1

Oto inne rozwiązanie, które pokazuje połączone katalogi. Nieco wolę, ponieważ jest to podzbiór „normalnego” wyjścia ls -l:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

W bash:

ls -d */

Wyświetla listę wszystkich katalogów

ls -ld */

wyświetli wszystkie katalogi w długiej formie

ls -ld */ .*/

wyświetli wszystkie katalogi, w tym katalogi ukryte, w długiej formie.


Niedawno przeszedłem na zsh (MacOS Catalina) i stwierdziłem, że:

ls -ld */ .*/

przestaje działać, jeśli bieżący katalog nie zawiera ukrytych katalogów.

zsh: no matches found: .*/

Wypisuje powyższy błąd, ale także nie wydrukuje żadnych katalogów.

ls -ld *(/) .*(/)

Również zawodzi w ten sam sposób.

Do tej pory odkryłem, że to:

ls -ld */;ls -ld .*/

jest przyzwoitym obejściem. Jest ;to separator poleceń. Ale oznacza to, że jeśli nie ma żadnych ukrytych katalogów, wyświetli listę katalogów i nadal drukuje błąd w przypadku braku ukrytych katalogów:

foo
bar
zsh: no matches found: .*/

lsjest polecenie powłoki dla lista zawartości bieżącego katalogu
-ljest flaga, aby określić, że chcesz do listy w Longford (jedna pozycja na linię + kilka innych informacji chłodnym)
-djest flaga do listy wszystkich katalogów „jako pliki”, a nie rekurencyjnie
*/jest argument „wyświetl wszystkie pliki kończące się ukośnikiem”
*jest prostym poleceniem regex dla „cokolwiek”, więc */prosi powłokę o wyświetlenie listy „cokolwiek kończącego się na” / ”

Zobacz man lspo więcej informacji.


Kładę to:

alias lad="ls -ld */;ls -ld .*/"

w moim .zshrc i wydaje się, że działa dobrze.

UWAGA: Odkryłem to również

ls -ld .*/ 2> /dev/null

nie działa, ponieważ nadal drukuje sterr na terminalu. Zaktualizuję swoją odpowiedź, jeśli / kiedy znajdę rozwiązanie.


0

du -d1jest być może najkrótszą opcją. (Tak długo, jak nie trzeba przesyłać danych wejściowych do innego polecenia).


0

Aby wyświetlić listę tylko katalogów w określonej ścieżce, wystarczy wpisać ls -l | grep drw


Może to obejmować pliki, jeśli zawierają je dowolne nazwy plików drw, i wyklucza katalogi, które nie są czytelne dla właściciela i nie mogą być zapisywane. grep ^ddziała lepiej.
— Tom Zych

0

Długa lista katalogów

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

Listowanie katalogów
- ls -d * /


Czy masz powód, aby powielić już istniejące odpowiedzi?
— Maxim Sagaydachny
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.