it-swarm-eu.dev

Vypsat pouze běžné soubory (nikoli však adresáře) v aktuálním adresáři

Můžu použít ls -ld */ pro zobrazení všech položek adresáře v aktuálním adresáři. Existuje podobně snadný způsob, jak pouze vypsat všechny běžné soubory v aktuálním adresáři? Vím, že mohu použít najít

find . -maxdepth 1 -type f

nebo stat

stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-

ale tohle mě nezdá být příliš elegantní. Existuje pěkný krátký způsob, jak vyjmenovat pouze běžné soubory (nezajímá mě zařízení, potrubí atd.), Ale ne podadresáře aktuálního adresáře? Výpis symbolických odkazů by byl plusem, ale není nutností.

132
daniel kullmann

Pomocí zsh a Glob Qualifiers ji můžete snadno vyjádřit přímo, např .:

echo *(.)

buď vrátí pouze seznam běžných souborů nebo chybu v závislosti na vaší konfiguraci.

Pro adresáře:

echo *(^/)

(bude zahrnovat symbolické odkazy (včetně adresářů), pojmenované potrubí, zařízení, zásuvky, dveře ...)

echo *(-.)

pro běžné soubory a odkazy na běžné soubory.

echo *(-^/)

pro adresáře bez adresářů a žádné odkazy na adresáře.

Pokud chcete zahrnout [~ # ~] d [~ # ~] ot soubory (skryté soubory), podívejte se také na kvalifikátor globpingu D ), například *(D-.).

36
Ulrich Dangel
ls -p | grep -v / 

Tento příkaz vypíše všechny skryté soubory, které nejsou adresáři (normální soubory, odkazy, soubory zařízení atd.). Chcete-li také zahrnout skryté soubory, přidejte -A možnost ls

Předpokládá, že žádný ze souborů nemá v názvu nové řádky. Přidání -q možnost ls by transformovala všechny netisknutelné znaky včetně nového řádku na ?, což zaručuje, že jsou na jednom řádku a jsou tak vhodné pro podávání do obslužného programu založeného na linkách, jako je grep, a pro tisk na terminálu.

177
Athul Biju

Chcete-li zobrazit pouze běžné soubory:

ls -al | grep '^-'

Včetně symbolických odkazů (na jakýkoli typ souboru):

ls -al | grep '^[-l]'

Kde první znak seznamu popisuje typ souboru, tak - Znamená, že se jedná o běžný soubor, pro symbolické propojení je l.

Debian/Ubuntu

Vytiskněte názvy všech odpovídajících souborů (včetně odkazů):

run-parts --list --regex . .

S absolutními cestami:

run-parts --list --regex . "$PWD"

Vytiskněte názvy všech souborů v /etc, Které začínají p a končící d:

run-parts --list --regex '^p.*d$' /etc
24
kenorb

ls nemá na to žádnou možnost, ale jednou z pěkných věcí o unixu a linuxu je to, že dlouho větrané a neúnosné potrubí lze snadno převést na skript, funkci nebo alias Shell. a ty mohou být zase použity v potrubí stejně jako jakýkoli jiný program.

(POZNÁMKA: Existují určité problémy s funkcemi a aliasy. Skripty jsou k dispozici všem spustitelným souborům, které je umí číst a spouštět. Aliasy a funkce jsou k dispozici pouze v aktuálním prostředí - i když subrofil/.bashrc atd. Sub-Shell může předefinovat také je můžete zpřístupnit. Skript lze psát v jakémkoli jazyce - včetně bash/sh, awk, Perl, python a dalších - podle toho, který z nich je pro danou práci nejvhodnější nebo s kterým jste nejvíce obeznámeni)

např.

alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'

Přidali jsme xargs, abyste mohli používat všechny obvyklé možnosti ls, např. lsf -lrS

Protože používá find, zobrazí se všechny normálně skryté tečky a všechny názvy souborů budou předponou ./ - to je jediný rozdíl, který si všimnete.

Soubory s tečkou můžete vyloučit pomocí ! -iname '.*' ale pak byste museli mít dvě verze aliasu - jednu, která zobrazovala tečky a druhou, která ne.

alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'

Alternativně, pokud lsf byl spíše skript než alias, můžete analyzovat možnosti (například pomocí getopts nebo/usr/bin/getopt nebo podobných) a vyloučit dotfiles, pokud -a byl přítomen.

15
cas
bash-4.2$ ls -F | grep -v '[/@=|]$' | more

Možnost -F ls připojí * k spustitelným souborům,/do adresářů, @ k symbolickým odkazům, = k soketům a | FIFO. Potom můžete pomocí grep vyloučit nestandardní znaky souboru z výstupu a máte soubory. To bude fungovat v jakémkoli prostředí, nejen zsh.

Slabé stránky jsou:

  1. Jakýkoli soubor, jehož jméno končí v @, = nebo | bude vyloučeno (ale stejně byste neměli mít soubory s těmito znaky v názvu)
  2. To nevylučuje soubory zařízení nebo některé exotické typy souborů v některých systémech, jako jsou dveře.
  3. Ke každému spustitelnému souboru budete mít připojenou hvězdičku. To by se dalo zvládnout potrubím sedem, aby se z výstupu odstranily všechny znaky „*“.
  4. To nefunguje správně, pokud existují názvy souborů obsahující znaky nového řádku.
8
kurtm

V manuálu bylo uvedeno, že volba „f“ je pouze proti „běžnému souboru“, nikoli k trubkám, zásuvkám nebo blokovacím/charitovým zařízením, což znamená, že už děláte správné věci.

   -type c
          File is of type c:

          b      block (buffered) special

          c      character (unbuffered) special

          d      directory

          p      named pipe (FIFO)

          f      regular file

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)
3
daisy

Toto není nijak zvlášť krátké, ale pokud byste ho potřebovali rychle zavolat, můžete jej změnit ve skript nebo alias. Pomocí příkazu ls jako vstupního pole zavolej ls -ld na každém záznamu, aby seskočil, aby vyloučil adresáře s výstupem odeslaným na null, a pokud bude úspěšný, ozvěna původního vstupu:

for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ;

Můžete převrátit grep a podmíněný výstup, stejné výsledky:

for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ;
0
Don R

Toto je trochu staré vlákno, ale nejčistší způsob, jak zobrazit pouze soubory.

ls -al | grep '^-' | awk '{print $9}'
0
R J