Vaše očekávání jsou založena na DOS Think/Windows Think a jsou mylná. Na MS-DOS, Windows a skutečně na několika dalších operačních systémech IBM/Microsoft se rozšíření zástupných znaků provádí samotným příkazem a věci jako /a možnost dir příkaz funguje jako filtr atributů během rozšiřování zástupných znaků. dir rozšiřuje zástupné znaky jako * , kterou mu příkazový interpret předá tak, jak je, a pokud /a je zadáno, použije příslušné filtry na to, co je vráceno. (Na některých operačních systémech lze filtry atributů zadat systémovému volání pro výčet adresáře a jádro operačního systému nebo jeho ovladače souborového systému je použije samo.)
Na Unices a Linuxu je rozšíření zástupných znaků prováděno shellem a nedbá na oprávnění. Když v kořenovém adresáři uděláte
ls *
co je ls samotný příkaz přijímá z shellu je (něco jako)
ls bin home opt var boot dev tmp etc lost+found root usr
Co je to -d /--directory možnost je vypnout to, co se normálně děje dál . Dále se normálně stane ls podívá se postupně na každý z jeho argumentů, vidí, že se jedná o adresáře, a rozhodne se vyjmenovat jejich obsah. U argumentů, které pojmenovávají soubory, pouze vytiskne informace pro samotný soubor. S -d s adresáři se zachází stejně jako se soubory. Takže ls vytiskne informace pro každý z adresářů, které jsou předány jako jeho argumenty, stejně jako by to bylo, kdyby to byly soubory.
Takže -d není možnost "tisknout pouze adresáře". Ve skutečnosti nejenže žádná taková možnost neexistuje; nemůže být taková možnost. Rozšíření zástupných znaků se provádí pomocí shellu a (v POSIX sh přinejmenším) neexistuje způsob, jak říct shellu, aby zkontroloval bity oprávnění a typu souboru, když se rozbalí * do seznamu jmen. Pro získání samotného seznamu názvů adresářů je nutné buď použít find příkaz, jak je vysvětleno ztank1013 , nebo použít trik, že název cesty končící lomítkem implikuje položku adresáře . , jak je vysvětleno Jin . (Jin trik končí u ls příkaz přijímající argumenty
ls bin/ home/ opt/ var/ boot/ dev/ tmp/ etc/ lost+found/ root/ usr/
protože vzor */ ve skutečnosti odpovídá názvům cest se dvěma komponentami, přičemž druhá je prázdná, a tak není úplně dělat, co bylo žádoucí. Zejména bude zacházet se symbolickými odkazy směřujícími na adresáře, jako by to byly adresáře.)
Chování ls -d bez * je jednoduchým rozšířením výše uvedeného. Člověk prostě musí vědět o ls ještě jednu věc :Když nejsou zadány žádné argumenty, předpokládá se výchozí argument . . Nyní bez -d výše uvedené chování vede k obsahu adresáře pojmenovaného . je vyjmenován a zobrazeny informace o jeho obsahu. S -d možnost, adresář . se zachází stejně, jako by se jednalo o soubor, a zobrazí se jeho vlastní informace, nikoli výčet jeho obsahu.
Můžete použít ls -d */ nebo ls -d .*/ pro skryté adresáře.
Zkuste toto
find . -mindepth 1 -maxdepth 1 -type d
získat pouze adresáře pod vaší aktuální polohou.