Musím dostať všetky typy prípon súborov do priečinka. Napríklad ak adresár „s ls dáva toto:
a.t
b.t.pg
c.bin
d.bin
e.old
f.txt
g.txt
Mal by som to získať spustením skriptu
.t
.t.pg
.bin
.old
.txt
Mám bash shell.
Mnohokrat dakujem!
odpovede:
3 pre odpoveď č. 1skúste to:
ls -1 | sed "s/^[^.]*(..*)$/1/" | sort -u
ls
zoznam súborov vo vašom priečinku, jeden súbor na riadoksed
prípony magických extraktovsort -u
triedi prípony a odstraňuje duplikáty
sed magic znie ako:
s/ / /
: nahrádza čokoľvek medzi prvým a druhým / čímkoľvek medzi druhým a tretím /^
: začiatok zápasu[^.]
: zhoda s ľubovoľným znakom, ktorý nie je bodka*
: priraďte to toľkokrát, koľkokrát je to možné(
a)
: pamätajte, čo sa zhoduje medzi týmito dvoma zátvorkami.
: zhoda s bodkou.
: zhoda s ľubovoľným znakom*
: priraďte to toľkokrát, koľkokrát je to možné$
: zhoda konca riadku1
: to je to, čo bolo porovnané medzi zátvorkami
7 pre odpoveď č. 2
vidieť položka BashFAQ na ParsingLS popis toho, prečo sú mnohé z týchto odpovedí zlé.
Nasledujúci prístup sa vyhne tejto nástrahe (a mimochodom úplne ignoruje súbory bez prípony):
shopt -s nullglob
for f in *.*; do
printf "%sn" ".${f#*.}"
done | sort -u
Medzi výhody patrí:
- správnosť:
ls
správa sa nedôsledne a môže mať za následok nevhodné výsledky. Odkaz nájdete v hornej časti. - Účinnosť: Minimalizuje počet vyvolaných podprocesov (iba jeden,
sort -u
, a ktoré by bolo možné odstrániť, aj keby sme chceli na ukladanie výsledkov použiť asociatívne polia Bash 4)
Veci, ktoré by sa ešte dali vylepšiť:
- Správnosť: toto správne zahodí nové riadky v názvoch súborov pred prvými
.
(ktoré niektoré ďalšie odpovede nevyhrajú) - ale názvy súborov s novými riadkami po prvom.
sa bude považovať za samostatné položky dosort
. To by sa dalo opraviť použitím núl ako oddeľovača alebo vyššie uvedeným prístupom úložiska asociatívneho poľa bash 4.
0 pre odpoveď č. 3
Ľudia to skutočne príliš komplikujú - najmä regex:
ls | grep -o "..*" | uniq
ls
- získať všetky súbory
grep -o "..*"
- -o
zobraziť iba zápas; "..*"
zápas pri prvom "." & všetko po ňom
uniq
- netlačte duplikáty, ale zachovajte rovnaké poradie
môžete tiež triediť, ak sa vám páči, ale zoradenie sa nezhoduje s príkladom
Toto sa stane, keď ho spustíte:
> ls -1
a.t
a.t.pg
c.bin
d.bin
e.old
f.txt
g.txt
> ls | grep -o "..*" | uniq
.t
.t.pg
.bin
.old
.txt