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?

Proszę pana
źródło
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

David Hancock
źródło
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
Rudzik
źródło
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

radiospiel
źródło
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 *(/)
echox
źródło
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
alleen1
źródło
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'"
somesh chandra
źródło
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:^\./::'
mda
źródło
☀ 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 .*/

kvivek
źródło
6

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

ls -d */ | sed -e "s/\///g"
Lakszmi
źródło
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 '^\.'

DomQ
źródło
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.

Johnsyweb
źródło
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.

slm
źródło
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 .

c-toesca
źródło
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*"
Surya
źródło
1

To działało dla mnie:

`ls -F | grep /`

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

FractalSpace
źródło
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
Amnon Harel
źródło
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.

DryLabRebel
źródło
0

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

Mohan
źródło
0

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

Loui
źródło
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 * /

Athi
źródło
Czy masz powód, aby powielić już istniejące odpowiedzi?
Maxim Sagaydachny