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.