'Ls -d' komutu dizinleri göstermiyor. 'Ls' almak için dosyalar ve dizinler yerine sadece dizinleri göstermenin bir yolu var mı?


44

lsDosya ve dizinlerin yerine sadece dizinleri görüntülemenin bir yolu var mı ?

Man sayfasından:

   -d, --directory
          list directory entries instead of contents, and do not  derefer
          ence symbolic links

Yani /dizine yazarsanız, sadece dizinleri görmeyi bekliyorum. Bunun yerine "" gösterir.

$ cd /
$ ls -d
.

ls -dBana bunu göstermeyi bekliyordum :

$ ls -d
bin    data  home        opt    sbin  sys      var
boot   dev   lib         media  proc  selinux  tmp
cdrom  etc   lost+found  mnt    root  srv      usr

lsDosya ve dizinlerin yerine sadece dizinleri görüntülemenin bir yolu var mı ?


17
lsd olabilir çok kafa karıştırıcı olabilir.
bohj

2
@jin ls - d * / eserler. Ama neden istediğimi çıkarmak için "* /" yapmak zorundayım.
nelaaro

8
@nelaar -dyalnızca dizinleri listelemek anlamına gelmez, dizin içeriğini listelemek anlamına gelmez. Yazmayı denediğinizde ls */tüm dizinlerin içeriğini göreceksiniz.
Jin

2
Ben var ldiretmek leştirilmiş ls -d */benim de .bashrcyapmak daha kolay olduğunu ...
DQdlM

1
Size sadece bilgi vermek için tonlarca bilgi verebilir, ancak tek bir bayrak
veremezsiniz

Yanıtlar:


50

Beklentileriniz DOS Think / Windows Think'e dayanıyor ve yanlış. MS-DOS, Windows ve diğer birkaç IBM / Microsoft işletim sisteminde, joker genişlemesi komutun kendisi tarafından yapılır ve komuta /aseçeneği gibi şeyler dirjoker genişlemesi sırasında öznitelik filtreleri olarak işlev görür. Komut yorumlayıcısının olduğu gibi geçtiği dirgibi joker karakterleri genişletir *ve /abelirtilirse döndürülen öğeye uygun filtreler uygular. (Bazı işletim sistemlerinde, bir dizini ve işletim sistemi çekirdeğini veya dosya sistemi sürücülerini numaralandırmak için sistem çağrısına öznitelik filtreleri verilebilir.)

Unices ve Linux'ta, joker karakter genişletmesi kabuk tarafından yapılır ve izinlere habersizdir. Ne zaman, kök dizinde

ls *

Ne lskomut kendisi alır kabuğundan (gibi bir şey) 'dir

ls bin ev opt var önyükleme dev tmp vb kayıp + bulundu kök usr

Ne -d/ --directoryseçenek yapmasıdır normalde sonra ne kapatın . Bundan sonra normal lsolan, argümanlarının her birine sırayla bakan, dizin olduklarını gören ve içeriklerini sıralamaya karar vermesidir. Dosyaları adlandıran argümanlar için, yalnızca dosyanın kendisinin bilgilerini yazdırır. Bu -dseçenekle, dizinler aynı dosyalar gibi değerlendirilir. Bu yüzden ls, her dosya için argüman olarak geçen, tıpkı dosya olsaydı, olduğu gibi bilgileri yazdırır.

Yani -d değil , bir "tek dizinleri yazdırmak" seçeneği. Aslında, sadece böyle bir seçenek yoktur; Orada olamaz böyle bir seçenek. Joker karakter genişletme, kabuk tarafından yapılır ve ( shen azından bir POSIX'de ), kabuğa *bir adlar listesine genişletildiğinde izin ve dosya türü bitlerini kontrol etmesini söylemenin bir yolu yoktur . Yalnız dizinleri isim listesini elde etmek için, gerekli ya kullanmayı findtarafından açıklandığı gibi, komut ztank1013ya da kısa çizgiyle ile biten bir yol adı dizin girişi ima hile kullanmak .tarafından açıklandığı gibi, Jin. ( Jin'nin numarası ls, argümanları alan komutla sona erer

ls bin / home / opt / var / önyükleme / dev / tmp / etc / lost + found / root / usr /

desen, çünkü */iki bileşen ile aslında eşleşen yol adlarının ise, ikinci bir varlık boşaltmak ve böylece değildir oldukça istenen ne yapıyor. Özellikle, dizinlere işaret eden sembolik bağları, sanki dizinmiş gibi ele alır.)

A ls -dolmadan davranış *yukarıdakilerin basit bir uzantısıdır. Bir kişi hakkında bir şey daha bilmek zorundadır ls: Hiçbir argüman verilmediğinde, varsayılan bir argüman olduğu varsayılır .. Şimdi , seçenek olmadan , -dyukarıda belirtilen davranış .numaralandırılarak adlandırılan dizinin içeriğine ve içeriğine ilişkin bilgilerin görüntülenmesine yol açar . İle-d seçeneği, dizin .bir dosya vardı ve kendi bilgi içeriği sayılan yerine görüntülenir sadece sanki tedavi edilir.


3
" böyle bir seçenek olamaz " - bu oldukça güçlü bir ifadedir - böyle bir seçeneğin uygulanması açıktır: dizin dışı bir argümana bakın ve görmezden gelin. Ne edemez uygulanacak eşdeğerdir dir /s *.txt[bulmak için olduğu gibi alıntı joker karakter başvurmadan]
Random832

6
Doğru, ama mantıklı bir neden yok , argüman olarak iletilen öğeleri filtreleyen bir seçeneğe sahip olamaz . Bu ilgisi beri "joker genişletme girişi tür denetimi boşanmış" gerçeği, alakasız hiç tek giriş tür denetimi, bu yapılamaz hiçbir neden yoktur - joker genişlemesi ile ilgisi tamamen ls içinde. Ls --color onları mavi renkle gölgeleyebilirse, ls -F bunların arkasına bir / sonra koyabilir ve ls - l modda bir 'd' koyabilir, sonra başka bir varsayımsal seçenek onları ihmal edebilir. Böyle bir seçeneğin bulunmadığı " yapamaz " anlamına gelmez .
Random832

5
Random832 iyi bir noktaya değinir: dosyaları veya dizinleri filtrelemek için bir seçeneğe sahip ls olabilir ve bu kabuğun genişlemesini sağlamakla karşılıklı olarak dışlanmaz . Ls içinde herhangi bir yarış koşulu yoktur: dosyaları normal bir şekilde değerlendirdiği için filtreleyebilir. (Kabuk genişlemesi ile ls, FWIW arasında zaten bir yarış var.) Kabuk genişlemesinin nedenin sadece bir parçası olduğunu düşünüyorum: Kabuk genişlemesi (ve genel olarak filtreleme) ls'de uygulanmadı çünkü cp'de tekrar uygulanması gerekecek. , mv, vs. Unix bir "bir şey yap ve iyi yap" dır. Gelişmiş filtrelemeye ihtiyacınız varsa, bunun için araçlar var.
Thanatos

2
Bu ls -pseçenek /yalnızca dizinlere bir sembol ekler . Çıktı yazdırma özelliklerini, yalnızca bunları çıkaran bir şeyle genişletmemek için hiçbir neden yoktur ls -p | grep /.
Anne van Rossum

3
@JdeBP, ad-hominem saldırıları ("kiddo") ve kibir (siz hariç "Unix'in temellerini" bilmiyor) herkes teknik bir tartışmaya dahil değildir. Ayrıca, bir komut seçeneğinin kabuk tarafından yapılan joker karakter genişlemesini kontrol edemediğini savunduğunuzda saman bir adam çekiyorsunuz. Tabii ki olamaz! Ne Random832, ne Thanatos, ne de Anne van Rossum ve sorunun kendisi hiçbir şekilde joker karakterlerden bahsetmiyor. İtiraz, bu ls --only-directories .seçeneğin lsnihayetinde eklenebileceği idi .
mkalkov

30

Kullanabilir ls -d */veya ls -d .*/gizli dizinler için.


/! kullanarak zekice bir numara!
Mono

Evet bu iyi. Bunun işe yaramadığı herhangi bir durum var mı?
iyrin

5
Bir satırda cevabı sağlamak için +1. Sanırım kabul edilen cevabın da bir yerlerde var.
Calculus Knight

Zaten dizinde olmadan bir betikte bunu kullanabilirsiniz?
DimiDak

13

Bunu dene

 find . -mindepth 1 -maxdepth 1 -type d

Bulunduğunuz yerin altındaki dizinleri almak için


5

bunu da beğenebilirsin

tree -d 

hangi ağaç yapısının grafiksel bir tasviri ile tüm dizinleri ve alt dizinleri düzgünce listeler.


3
Ve sadece bir seviye derinlikte:tree -dL 1
Anne van Rossum

Maalesef ağaçla pek bir şey yapamazsınız # ağaç -d | grep wc -l (standart giriş)
DimiDak

5

Dizinleri yalnızca ls -l(ELL) seçeneği gibi ayrıntılarla görmek istiyorsanız, aşağıdakileri kullanabilirsiniz:

find -maxdepth 1 -type d -ls;

Yukarıdaki -lseçenek , yalnızca seçenekle aldığınız gibi ayrıntıları size verecektir .


1
Her find -maxdepth 1 -type d -exec ls -d {} +zamanki lsformatta çıktı almak için kullanmak daha iyi olabilir .
mkalkov

4

İşi başka bir şekilde yapmak istiyorsanız, şunu deneyin:

ls -l | grep ^d

Bu durumda tek bir araç yeterli olsa da. Boru hattı her zaman size yardımcı olmak için orada. Linux'taki esnekliği seviyorum, keşke yapsanız da.


1
Bu, dizinlerden daha fazlasını filtreleyecek.
ocodo

2
@Slomojo, bu dizin dışındaki her şeyi filtreleyecektir. Ne demek istedin?
mkalkov

Evet, - l'e (uzun) ihtiyacın var, böylece izinler çizgiyi yükseltiyor Dizin için "d". Ayrıca, güzel bir dizin girişinin "uzun" bir listesini elde edersiniz.
geoO

1

Umarım bu ihtiyacınızı giderir. Aşağıdaki komut yalnızca belirli bir yoldaki dizinleri listeler.

ls -F <path> | grep /

Örnek:

ls -F ~ | grep /
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.