Jak wyświetlić listę folderów za pomocą poleceń bash?

52

Czy jest jakiś sposób, aby wyświetlić tylko foldery w katalogu za pomocą poleceń bash? (ponieważ lspolecenie wyświetla wszystkie pliki i foldery)

SpiXel
źródło

Odpowiedzi:

66

Możesz użyć:

ls -d -- */

Ponieważ wszystkie katalogi kończą się na /, lista zawiera tylko katalogi na bieżącej ścieżce. Opcja -d zapewnia, że ​​drukowane są tylko nazwy katalogów, a nie ich zawartość.

Gafel
źródło
2
ls - * / wyświetla wszystkie katalogi z ich zawartością poniżej
Vins
1
@ 8088 Jaka jest różnica między ls -d -- */i ls -d */?
Louis
5
@Louis, --jest konwencjonalnie używany do oznaczania końca opcji, tak że jeśli plik ma nazwę, -lls nie zinterpretuje go jako opcji formatu długiego listowania.
Cristian Ciupitu
28

Odpowiedź Stephena Martina dała ostrzeżenie i wymieniła również bieżący folder, więc sugeruję

find . -mindepth 1 -maxdepth 1 -type d

(To dotyczy Linuksa; nie mogłem znaleźć -maxdepth i -mindepth na stronie podręcznika POSIX dla find)

Daniel Kullmann
źródło
1
Starsze pytanie, które znam. Chociaż na początku też chciałbym znaleźć to zadanie, podoba mi się ta ls -d -- */opcja, podobnie jak findi ukryte katalogi. Co może być czasem przydatne, ale czasem może powodować problemy. Mam nadzieję, że ten komentarz może pomóc innym. +1
matchew
12
find . -maxdepth 1 -type d

Wyświetli tylko foldery. I jak zauważył Teddy, będziesz potrzebować -maxdepth, aby zatrzymać powrót do sub-reż

0x7c0
źródło
5
Ty też pewnie chcesz -maxdepth 1.
Teddy
6

Odpowiedź Daniela jest poprawna. Oto kilka przydatnych dodatków.

Aby uniknąć wyświetlania ukrytych folderów (takich jak .git), spróbuj tego:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \)

Aby zamienić przerażające kropki na początku danych findwyjściowych w niektórych środowiskach, użyj tego:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'
Mathias Bynens
źródło
1

„Nie powinieneś” analizować wyniku ls, a przynajmniej tak się mówi. Powodem tego jest to, że dane wyjściowe mają być czytelne dla ludzi i może to niepotrzebnie komplikować parsowanie, o ile pamiętam.

jeśli nie chcesz ls lub znaleźć, możesz spróbować filtrować „*” za pomocą „[-d]”.

Zrobiłem właśnie to, z jakiegoś powodu i nie działało (nazwy plików ze spacjami i nawiasami, jak sądzę, lub coś innego, co przeoczyłem), a potem zrobiłem coś w stylu

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
samotny debianer
źródło
0

Żeby podkreślić to, co mnie tutaj pomyliło, jeśli chodzi o wybór globalnych wzorców; powiedz, że masz to:

$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03

8 directories, 8 files

Powiedzmy, że chcesz wybrać tylko mydir*katalogi. Pamiętaj, że jeśli pominiesz końcowy ukośnik, ls -dwyświetli się także lista plików:

$ ls -d testglob/mydir*   # also `ls -d -- testglob/mydir*`
testglob/mydir_00      testglob/mydir_01      testglob/mydir_02      testglob/mydir_03
testglob/mydir_00.txt  testglob/mydir_01.txt  testglob/mydir_02.txt  testglob/mydir_03.txt

... jednak z kończącym ukośnikiem wyświetlane są tylko katalogi:

$ ls -d testglob/mydir*/   # also `ls -d -- testglob/mydir*/`
testglob/mydir_00/  testglob/mydir_01/  testglob/mydir_02/  testglob/mydir_03/
sdaau
źródło
0

printf "%s\n" */ wyświetli listę wszystkich katalogów w $ PWD.

echo */ będzie również działać, ale w długiej linii, trudniej, gdy nazwy mają spacje.


źródło