/ / skript na získanie rozšírenia súboru - súbor, bash

skript pre získanie rozšírení súboru - súbor, bash

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ď č. 1

skúste to:

ls -1 | sed "s/^[^.]*(..*)$/1/" | sort -u
  • ls zoznam súborov vo vašom priečinku, jeden súbor na riadok
  • sed prípony magických extraktov
  • sort -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 riadku
  • 1: 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 do sort. 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