Chcę wymienić tylko katalogi w określonej ścieżce ( ls
nie ma takiej opcji). Czy można to również zrobić za pomocą polecenia w jednej linii?
Chcę wymienić tylko katalogi w określonej ścieżce ( ls
nie ma takiej opcji). Czy można to również zrobić za pomocą polecenia w jednej linii?
Odpowiedzi:
Spróbuj ls -d */
wyświetlić listę katalogów w bieżącym katalogu
ls -al | grep '^d'
- to jest bardziej zwięzłe.
*/
wymusza wyświetlanie tylko elementów kończących się ukośnikiem, który w tym przypadku byłby katalogiem, nawet jeśli -F
opcja ls
nie byłaby używana. Podobne do zachowania ls *php
i sposobu wyświetlania wszystkich plików kończących się php
w katalogu.
echo */
zrobi to samo za
Spróbuj tego:
find . -maxdepth 1 -type d
ls
rozwiązań, find
ponosi 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.
find * -maxdepth 0 -type d
.
find
zwykle wykonuje, ale wyświetla tylko foldery na głębokości 1.
Następujące
find * -maxdepth 0 -type d
w zasadzie filtruje rozszerzenie -type d
warunku „*”, 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
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 *(/)
tree
?
tree
domyślnie nie jest instalowana (chociaż jest w repozytoriach).
tree
polecenie nie jest rodzimym poleceniem uniksowym (popraw mnie, jeśli się mylę).
Ponieważ istnieje wiele sposobów, aby to zrobić, oto kolejny:
tree -d -L 1 -i --noreport
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
ls -l | grep '^d'
Możesz utworzyć alias i umieścić go w pliku profilu
alias ld="ls -l| grep '^d'"
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
użyj tego, aby uzyskać listę katalogów
ls -d */ | sed -e "s/\///g"
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 grep
usunąć:
find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
mindepth
o pozbyciu się .
! 😁
Odpowiedź będzie zależeć od twojej powłoki .
Na zsh
przykład możesz wykonać następujące czynności:
echo *(/)
Zostaną wyświetlone wszystkie katalogi w bieżącym katalogu roboczym.
Zobacz man zshexpn
po 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
.
Aby to zrobić, możesz użyć tree
polecenia z d
przełącznikiem.
% tree -d tstdir
tstdir
|-- d1
| `-- d11
| `-- d111
`-- d2
`-- d21
`-- d211
6 directories
zobacz man tree
więcej informacji.
tree
. No cóż, nie miałem zamiaru ukraść niczyich grzmotów.
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 .
To działało dla mnie:
`ls -F | grep /`
(Ale przechodzę na, echo */
jak wspomniano @nos)
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
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: .*/
ls
jest polecenie powłoki dla lista zawartości bieżącego katalogu
-l
jest flaga, aby określić, że chcesz do listy w Longford (jedna pozycja na linię + kilka innych informacji chłodnym)
-d
jest 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 ls
po 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.
Długa lista katalogów
Listowanie katalogów
- ls -d * /