GNU/Linux >> Znalost Linux >  >> Linux

Příkaz 'ls -d' nezobrazuje adresáře. Existuje způsob, jak získat 'ls', aby zobrazoval pouze adresáře namísto souborů a adresářů?

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.


Linux
  1. Najděte soubory a adresáře v Linuxu pomocí příkazu find

  2. Snadný způsob, jak skrýt soubory a adresáře v Linuxu

  3. cp pouze soubory, přeskakování adresářů

  1. Najděte největší soubory a adresáře v Linuxu

  2. Jak získat počet souborů v adresáři pomocí příkazového řádku?

  3. Existuje způsob, jak změnit ID svazku souborů .iso z příkazového řádku?

  1. Jak odstranit adresáře a soubory pomocí Linuxu

  2. Odstraňte pouze soubory v adresáři v adresářích linux NOT

  3. Jak dosáhnout toho, aby se pro konkrétní proces spustil pouze uživatel, pid a příkaz? (Ubuntu 11.10)