Odpowiedzi:
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ść.
ls -d -- */
i ls -d */
?
--
jest konwencjonalnie używany do oznaczania końca opcji, tak że jeśli plik ma nazwę, -l
ls nie zinterpretuje go jako opcji formatu długiego listowania.
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)
ls -d -- */
opcja, podobnie jak find
i 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
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 find
wyjściowych w niektórych środowiskach, użyj tego:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
„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
Ż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 -d
wyś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/
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.
Możesz także użyć:
du
Lub:
git ls-tree -d -r --name-only @