Ik wil de bestandsnaam (zonder extensie) en de extensie apart krijgen.
De beste oplossing die ik tot nu toe heb gevonden is:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
Dit is fout omdat het niet werkt als de bestandsnaam meerdere .
tekens bevat. Als, laten we zeggen, ik a.b.js
heb, zal het a
en b.js
beschouwen, in plaats van a.b
en js
.
Het kan gemakkelijk worden gedaan in Python met
file, ext = os.path.splitext(path)
maar ik'zou liever geen Python interpreter opstarten alleen voor dit, indien mogelijk.
Iemand een beter idee?
Eerst, haal de bestandsnaam zonder het pad:
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
Als alternatief kunt u zich richten op de laatste '/' van het pad in plaats van de '.' die zou moeten werken, zelfs als u onvoorspelbare bestandsextensies hebt:
filename="${fullfile##*/}"
Misschien wilt u de documentatie raadplegen :
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
Voor meer details, zie shell parameter uitbreiding in de Bash handleiding.
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js
werkt prima, dus je kunt gewoon gebruiken:
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
De commando's werken, tussen haakjes, als volgt.
Het commando voor NAAM
vervangt een "."
teken gevolgd door een willekeurig aantal niet-"."
tekens tot aan het einde van de regel, door niets (dat wil zeggen, het verwijdert alles vanaf de laatste "."
tot aan het einde van de regel, inclusief). Dit is in feite een niet-grijze vervanging die gebruik maakt van regex trucjes.
Het commando voor EXTENSION
vervangt een willekeurig aantal tekens gevolgd door een "."
teken aan het begin van de regel, door niets (dat wil zeggen, het verwijdert alles vanaf het begin van de regel tot de laatste punt, inclusief). Dit is een gretige vervanging die de standaard actie is.