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í.
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-.)
.
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.
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
.
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
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.
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:
@
, =
nebo |
bude vyloučeno (ale stejně byste neměli mít soubory s těmito znaky v názvu)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)
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 ;
Toto je trochu staré vlákno, ale nejčistší způsob, jak zobrazit pouze soubory.
ls -al | grep '^-' | awk '{print $9}'