Yalnızca UNIX içindeki dizinleri listeleme


219

Yalnızca belirtilen yoldaki dizinleri listelemek istiyorum ( lsböyle bir seçeneği yoktur). Ayrıca, bu tek bir satır komutuyla yapılabilir mi?


12
Gelecek için: Belki unix / linux temelleri programlama ile ilgili o kadar zor olmayan sorular türü orada daha iyi tutmak
echox

Yanıtlar:


315

ls -d */Geçerli dizindeki dizinleri listelemek için bunu deneyin


17
Hey, bu oldukça şık, her zaman bize ls -al | grep '^d'alırdım - bu çok daha özlü.
paxdiablo

43
neden * / ?? lütfen açıkla!?
Chandeep

6
Düzgün bir açıklama yok, ancak ben */sadece bir eğik çizgi ile biten öğelerin görüntülenmesini zorlar biliyorum, bu durumda bir -Fseçenek olurdu bile, bu durumda bir dizin olacaktır ls. Bir dizinde ls *phpbiten tüm dosyaların davranışına ve nasıl görüntülendiğine benzer php.
David Hancock

3
@ user975234 Birisi benzer bir soru sordu ve bağlantı
user1766760

17
Sadece echo */aynısını yapacağız
nos

95

Bunu dene:

find . -maxdepth 1 -type d

8
Bana göre bu yapılması gereken gibi görünüyor. Önerilen lsçözümlerin aksine find, sadece işi yapmaktan sorumludur (sınırlar getirebilen kabuk joker karakter genişletmesine güvenmemek). Aynı zamanda çok daha özlü.
peterp

1
Bu konuda kötü olan şey, sonuçlar arasında geçiş yapmaya çalışıyorsanız ve sonuçlarınızın adlarda boşluklar olması durumunda işe yaramamasıdır.
Ubiquibacon

2
Alternatif olarak, dizinin kendisini dahil etmek istemiyorsa: find * -maxdepth 0 -type d.
James Ko

@ubiquibacon ya find's' -print0ya da -execseçeneği kullanın.

1
En azından Mac bilgisayarımda bu gerçekten yavaş. Genellikle findklasörleri derinlik 1'de veren ancak çıktı veren tam özyinelemeli arama yapıyor gibi görünüyor .
Kara Brightwell

22

Devamındaki

find * -maxdepth 0 -type d

temel olarak '*' ifadesinin genişlemesini, yani geçerli dizindeki tüm girişleri -type dkoşullara göre filtreler .

Avantajı, çıktı ile aynıdır ls -1 *, ancak sadece dizinlerle ve girdiler bir nokta ile başlamaz


13

Sen kullanabilirsiniz ls -d */veyatree -d

Başka bir çözüm globbing olurdu, ancak bu kullandığınız kabuğa ve dizinler için globbing'in desteklenip desteklenmediğine bağlıdır.

Örneğin ZSH:

zsh # ls *(/)

3
Hangi Unix lezzetini elde edersiniz tree?
Johnsyweb

örneğin tüm büyük linux rahatsızlıkları? üzgünüm, soruyu anlamadım?
echox

1
Bir Debian dağıtım var ve tree(depolarda olmasına rağmen) varsayılan olarak yüklü değil.
Stephen Schrauger

1
Komutun treeyerel bir unix komutu olmadığına inandığım için aşağıya oy verin (yanlışsam lütfen beni düzeltin).
Tiago Cardoso

10

Bunu yapmanın onlarca yolu olduğundan, işte bir tane daha:

tree -d -L 1 -i --noreport
  • -d: dizinler
  • -L: ağacın derinliği (dolayısıyla 1, çalışma dizinimiz)
  • -i: girinti yok, yalnızca baskı adları
  • --noreport: ağaç listesinin sonunda bilgi bildirme

Ve anahtarları açıkladığınız için teşekkür ederiz. Yığın Taşması cevaplarla ilgilidir, insanlar bir açıklama ile "sadece adam girişini okuyun!" <- bu bir cevap değil.
fusion27

Satır 2'den başlamak için (satırı sadece bir nokta ile atlayın):tree -d -L 1 -i --noreport | tail -n +2
adius

Bu, yumuşak bağlantılı dizinleri listeleyen ve bunları faydalı bir şekilde, bağlantı olarak göstererek en üst sıradaki çözümdür. Varyasyonu tercih ediyorum:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel

9
ls -l | grep '^d'

Bir takma ad oluşturabilir ve profil dosyasına koyabilirsiniz

alias ld="ls -l| grep '^d'"

1
bağlantılar bu komutla görüntülenmez. Ve bir bağlantı bir dosya veya dizin olabilir. Örnek: lrwxrwxrwx 1 kök kökü 21 avril 15 17:38 cron -> / lib / init / upstart-job.
c-toesca

7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'

☀ bulmak. -maxdepth 1 -tipi d-adı [^ \.] * | sed 's: ^ \ ./ ::' zsh: Eşleşme bulunamadı: [^.] *
Michael Cole

6

Geçerli çalışma dizinindeki dizinleri listelemek için ls -d */kullanılabilir. Ve gizli dizinleri listelemeniz gerekiyorsa bu komutu kullanın ls -d .*/


6

bir dizin listesi almak için bunu kullanın

ls -d */ | sed -e "s/\///g"

ls -d <özel-dizin-yol> | sed -e "s / \ /// g" çalışmıyor .. herhangi bir ipucu?
Dhwanit

Teşekkür ederim! Ben sadece tüm izinleri olmadan dizin listesini istedim ve bu hile yaptı. :)
codingjeremy

5

find specifiedpath -type d

Alt dizinlerde yinelemek istemiyorsanız, bunun yerine bunu yapabilirsiniz:

find specifiedpath -type d -mindepth 1 -maxdepth 1

"Adı" ile başlayan "nokta" dizinlerinin .de listeleneceğini unutmayın; ama özel dizinler .de değil ... Eğer "nokta" dizinleri istemiyorsanız, sadece grepdışarı çıkarabilirsiniz :

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'


1
Kurtulmaktan bahsettiğiniz mindepthiçin oy verin .! 😁
adius

5

Cevap kabuğunuza bağlı olacaktır .

In zshÖrneğin, aşağıdakileri yapabilirsiniz:

echo *(/)

Ve geçerli çalışma dizinindeki tüm dizinler görüntülenecektir.

Daha man zshexpnfazla bilgi için bakınız .

find(1)Çoğu Unix aroması üzerinde çalışması gereken alternatif bir yaklaşım kullanmak olacaktır :

find . -maxdepth 1 -type d -print  

find(1)birçok kullanımı vardır, bu yüzden kesinlikle tavsiye ederim man find.


4

Bunu gerçekleştirmek için treekomutu danahtarıyla birlikte kullanabilirsiniz .

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

man treedaha fazla bilgi için bakınız .


Ben küçümsedim, sadece aynı soru vardı. Görünüşe göre cevabınız yankıların bir çiftidir, belki bu yüzden?
Louis Waweru

1
@ Louis - teşekkürler onun sözünü bile fark etmedim tree. Ah, niyetim kimsenin gök gürültüsünü çalmak değildi.
slm

ağacın ne yaptığının görselleştirilmesi için oylama
Andrejs

İnanıyorum ki downvotes, bunun stackoverflow.com/a/3667405/523742 ile
Tiago Cardoso

@TiagoCardoso - benimki 2 yıl önceydi.
slm

2

Bu dizine sahipsem:

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

Tüm dizinleri almak için -L komutunu kullanarak bağlantıları çözün:

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

-L olmadan:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

conf_nagios dizini eksik.


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*"

1

Bu benim için çalışıyor:

`ls -F | grep /`

(Ama echo */@nos tarafından belirtildiği gibi geçiyorum)


1

Bağlantılı dizinleri gösteren başka bir çözüm. Biraz tercih ederim çünkü "normal" ls -l çıktı bir alt kümesi:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

Bash'da:

ls -d */

Tüm dizinleri listeler

ls -ld */

tüm dizinleri uzun biçimde listeler

ls -ld */ .*/

gizli dizinler dahil tüm dizinleri uzun biçimde listeler.


Son zamanlarda zsh (MacOS Catalina) geçti ve buldum:

ls -ld */ .*/

Artık çalışmıyor eğer geçerli dizin hiçbir gizli dizinleri içerir.

zsh: no matches found: .*/

Yukarıdaki hatayı yazdıracak, ancak herhangi bir dizin yazdırılamayacak.

ls -ld *(/) .*(/)

Aynı şekilde başarısız olur.

Şimdiye kadar bunu buldum:

ls -ld */;ls -ld .*/

iyi bir çözümdür. Bu ;bir komut ayırıcıdır. Ancak, gizli dizin yoksa, dizinleri listeleyeceği ve hala gizli dizinler için hatayı yazdıracağı anlamına gelir:

foo
bar
zsh: no matches found: .*/

lsgeçerli dizinin liste içeriğinin kabuk komutu
-lLongford'da listelemek istediğiniz işarettir (satır başına bir öğe + bir dizi diğer serin bilgi)
-dtüm dizinleri "dosya" olarak listeleyen ve özyinelemeli olmayan işarettir
*/. 'eğik çizgi ile biten tüm dosyaları listele' argümanı
* "herhangi bir şey" için basit bir normal ifade komutudur, bu nedenle */kabuktan "/" ile biten her şeyi listelemesini ister

Görmek man lsfazla bilgi için .


Bunu koydum:

alias lad="ls -ld */;ls -ld .*/"

benim .zshrc, ve iyi çalışıyor gibi görünüyor.

NOT: Bunu da keşfettim

ls -ld .*/ 2> /dev/null

terminale sterr yazdırdığı için çalışmıyor. Bir çözüm bulduğumda / bulduğumda cevabımı güncelleyeceğim.


0

du -d1belki de en kısa seçenektir. (Girişi başka bir komuta yönlendirmeniz gerekmediği sürece.)


0

Yalnızca belirtilen bir yoldaki dizinleri listelemek için ls -l | grep drw


Dosya adları drw, dosya içeriyorsa dosyaları içerebilir ve sahip tarafından okunamayan ve yazılabilir olmayan dizinleri hariç tutar. grep ^ddaha iyi çalışır.
Tom Zych

0

Dizinlerin uzun listesi

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

Liste dizinleri
- ls -d * /


Mevcut cevapları çoğaltmak için iyi bir nedeniniz var mı?
Maxim Sagaydachny
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.