Chcem získať názov súboru (bez prípony) a príponu samostatne.
Najlepšie riešenie, ktoré som zatiaľ našiel, je:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
Toto je nesprávne, pretože nefunguje, ak názov súboru obsahuje viac znakov .
. Ak, povedzme, mám a.b.js
, bude to brať do úvahy a
a b.js
namiesto a.b
a js
.
V Pythone sa to dá jednoducho urobiť pomocou
file, ext = os.path.splitext(path)
ale ak je to možné, nerád by som kvôli tomu spúšťal interpreter Pythonu.
Nejaké lepšie nápady?
Najprv získajte názov súboru bez cesty:
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
Prípadne sa môžete zamerať na posledné '/' z cesty namiesto '.', čo by malo fungovať aj v prípade nepredvídateľných prípon súborov:
filename="${fullfile##*/}"
Možno si budete chcieť pozrieť dokumentáciu :
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
Podrobnejšie informácie nájdete v shell parameter expansion v príručke Bash.
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js
funguje dobre, takže stačí použiť:
pax> FILE=a.b.js
pax> NAME=$(echo "$FILE" | sed 's/\.[^.]*$//')
pax> EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
pax> echo $NAME
a.b
pax> echo $EXTENSION
js
Príkazy mimochodom fungujú nasledovne.
Príkaz pre NAME
nahradí znak "."
, za ktorým nasleduje ľubovoľný počet znakov, ktoré nie sú "."
, až po koniec riadku, ničím (t. j. odstráni všetko od posledného znaku "."
až po koniec riadku vrátane). Ide v podstate o nešetrnú substitúciu pomocou regexového triku.
Príkaz pre EXTENSION
nahradí ľubovoľný počet znakov, za ktorými nasleduje znak "."
na začiatku riadku, ničím (t. j. odstráni všetko od začiatku riadku po konečnú bodku vrátane). Ide o nenásytné nahrádzanie, ktoré je predvolenou akciou.