Haluan saada tiedostonimen (ilman laajennusta) ja laajennuksen erikseen.
Paras tähän mennessä löytämäni ratkaisu on:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
Tämä on väärin, koska se ei toimi, jos tiedostonimi sisältää useita .
-merkkejä. Jos minulla on esimerkiksi a.b.js
, se katsoo a
ja b.js
eikä a.b
ja js
.
Se voidaan tehdä helposti Pythonissa komennolla
file, ext = os.path.splitext(path)
mutta en haluaisi käynnistää Python-tulkkia vain tätä varten, jos mahdollista.
Onko parempia ideoita?
Hae ensin tiedoston nimi ilman polkua:
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
Vaihtoehtoisesti voit keskittyä polun viimeiseen '/' -kirjaimeen '.':n sijasta, minkä pitäisi toimia, vaikka tiedostopäätteet olisivat arvaamattomia:
filename="${fullfile##*/}"
Kannattaa tarkistaa dokumentaatio :
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
Lisätietoja on shell parameter expansion Bash-käsikirjassa.
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js
toimii hienosti, joten voit vain käyttää:
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
Komennot toimivat muuten seuraavasti.
Komento NAME
korvaa "."
-merkin, jota seuraa mikä tahansa määrä muita kuin "."
-merkkejä rivin loppuun asti, tyhjällä (eli se poistaa kaiken viimeisestä "."
-merkistä rivin loppuun asti). Tämä on periaatteessa ei-ihanaa korvaamista regex-temppuilulla.
Komento EXTENSION
korvaa minkä tahansa määrän merkkejä, joita seuraa merkki "."
rivin alussa, tyhjällä (eli se poistaa kaiken rivin alusta viimeiseen pisteeseen, piste mukaan lukien). Tämä on ahne korvaaminen, joka on oletusarvoinen toiminto.