A fájlnév és kiterjesztés kivonása Bash-ben

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?

Megoldás

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 :

Kommentárok (20)
~% 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.

Kommentárok (16)
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.

Kommentárok (1)