A fájlnevet (kiterjesztés nélkül) és a kiterjesztést külön-külön szeretném megkapni.
A legjobb megoldás, amit eddig találtam, a következő:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
Ez azért rossz, mert nem működik, ha a fájlnév több .
karaktert tartalmaz. Ha, mondjuk, van a.b.js
, akkor a
és b.js
helyett a.b
és js
fog figyelembe venni.
Ez Pythonban könnyen elvégezhető a
file, ext = os.path.splitext(path)
de ha lehet, nem szeretnék Python-értelmezőt indítani csak ezért, ha lehetséges.
Valami jobb ötlet?
Először is, a fájl nevét az elérési útvonal nélkül:
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
Alternatívaként az '.' helyett az elérési útvonal utolsó '/' -jére is összpontosíthat, aminek még akkor is működnie kell, ha kiszámíthatatlan fájlkiterjesztésekkel rendelkezik:
filename="${fullfile##*/}"
Érdemes megnézni a dokumentációt :
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
További részletekért lásd a shell parameter expansion a Bash kézikönyvben.
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js
jól működik, így egyszerűen használhatod:
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
A parancsok egyébként a következőképpen működnek.
A NAME
parancs a "."
karaktert, amelyet tetszőleges számú nem "."
karakter követ a sor végéig, semmivel helyettesíti (azaz az utolsó "."
-tól a sor végéig mindent eltávolít, beleértve a sort is). Ez alapvetően egy nem zsugori helyettesítés, amely regex trükköket használ.
Az EXTENSION
parancs a sor elején lévő tetszőleges számú karaktert, amelyet egy "."
karakter követ, a semmivel helyettesíti (azaz mindent eltávolít a sor elejétől az utolsó pontig, beleértve). Ez egy mohó helyettesítés, ami az alapértelmezett művelet.