Bash komutlarını kullanarak klasörler nasıl listelenir?


52

Bash komutlarını kullanarak yalnızca bir dizindeki klasörleri listelemenin bir yolu var mı? ( lskomut tüm dosyaları ve klasörleri listeler)

Yanıtlar:


66

Kullanabilirsiniz:

ls -d -- */

Tüm dizinler bittiğinden /, bu sadece geçerli yoldaki dizinleri listeler. -D seçeneği yalnızca dizin isimleri, içeriklerini değil basılmış olmasını sağlar.


2
ls - * /, tüm dizinleri, içerikleri aşağıda yer almaktadır
Vins

1
@ 8088 ls -d -- */ve arasındaki fark nedir ls -d */?
Louis

5
@Louis, --geleneksel olarak seçeneklerin sonunu işaretlemek için kullanılır, böylece bir dosya -lls olarak adlandırılırsa , onu uzun liste formatı seçeneği olarak yorumlamaz.
Cristian Ciupitu,

28

Stephen Martin'in cevabı bir uyarı verdi ve mevcut klasörü de listeledi, bu yüzden öneriyorum

find . -mindepth 1 -maxdepth 1 -type d

(Bu Linux'ta; bulmak için POSIX man sayfasında -maxdepth ve -mindepth'i bulamadım)


1
Büyük soru biliyorum. Başlangıçta bu görevi bulmak için dönmeye devam ederken ls -d -- */, findgizli yönetimleri de bulacağı gibi bu seçeneği seviyorum. Bu bazen yararlı olabilir, ancak bazen de sorunlara neden olabilir. Umarım bu yorum başkalarına yardımcı olabilir. +1
saat

12
find . -maxdepth 1 -type d

Sadece klasörleri listeler. Ve Teddy'nin belirttiği gibi, alt direklere geri dönmesini durdurmak için -ma derinliğe ihtiyacınız olacak


5
Muhtemelen sen -maxdepth 1de istiyorsun .
Teddy

6

Daniel'in cevabı doğru. İşte bazı yararlı eklemeler olsa da.

Gizli klasörleri listelemekten kaçınmak için .git, şunu deneyin:

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

Ve bazı ortamlarda, çıkışın başlangıcındaki korkutucu nokta eğrisini değiştirmek için şunufind kullanın:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'

1

Sen, onun çıktısını çözümlememelisin, demiştin, ya da öyle söylenir. Bunun arkasındaki sebep, çıktının insan tarafından okunabilir olması ve hatırlatırsam ayrıştırmayı gereksiz yere karmaşık hale getirmesidir.

ls veya bulmak istemiyorsanız, "*" ile "[-d]" öğesini filtrelemeyi deneyebilirsiniz.

Ben sadece bunu yaptım, bir sebepten dolayı işe yaramadı ve bulmadım (sanırım boşlukları ve parantezleri olan dosya isimleri, ya da göz ardı ettiğim başka bir şey), sonra da çizgileri boyunca bir şeyler yaptım

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done

0

Glob kalıp seçiminde beni şaşırtan bir şeyi vurgulamak için; buna sahip olduğunuzu söyleyin:

$ 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

Yani, burada sadece mydir*dizinleri seçmek istediğinizi söyleyin . Sona eren eğik çizgiden çıkarsanız, ls -ddosyaları da listeleyeceğini unutmayın:

$ 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

... ancak, sonlanan eğik çizgiyle birlikte, yalnızca dizinler listelenir:

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

0

printf "%s\n" */ $ PWD içindeki tüm dizinleri listeleyecektir.

echo */ aynı zamanda çalışacak, ancak uzun bir satırda, adların boşlukları varken daha zor.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.