Jeg ønsker at få filnavnet (uden udvidelse) og udvidelsen separat.
Den bedste løsning, jeg har fundet indtil videre, er:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
Dette er forkert, fordi det ikke virker, hvis filnavnet indeholder flere .
-tegn. Hvis, lad os sige, jeg har a.b.js
, vil den overveje a
og b.js
, i stedet for a.b
og js
.
Det kan nemt gøres i Python med
file, ext = os.path.splitext(path)
men jeg foretrækker ikke at skulle fyre en Python-fortolker op bare for dette, hvis det er muligt.
Nogen bedre ideer?
Først skal du hente filnavnet uden stien:
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
Alternativt kan du fokusere på den sidste '/' i stien i stedet for '.' hvilket burde virke, selv hvis du har uforudsigelige filtypenavne:
filename="${fullfile##*/}"
Du kan tjekke dokumentationen :
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
For flere detaljer, se shell parameterudvidelse i Bash-manualen.
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js
fungerer fint, så du kan bare bruge:
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
Kommandoerne fungerer i øvrigt på følgende måde.
Kommandoen for NAME
erstatter et "."
-tegn efterfulgt af et vilkårligt antal ikke-"."-tegn op til slutningen af linjen, med ingenting (dvs. den fjerner alt fra det sidste
"."` til slutningen af linjen, inklusive). Dette er grundlæggende en ikke-grådig substitution ved hjælp af regex-tricks.
Kommandoen for EXTENSION
erstatter et vilkårligt antal tegn efterfulgt af et "."
-tegn i starten af linjen med ingenting (dvs. den fjerner alt fra starten af linjen til det sidste punktum, inklusive). Dette er en grådig substitution, som er standardhandlingen.