Voglio ottenere il nome del file (senza estensione) e l'estensione separatamente.
La soluzione migliore che ho trovato finora è:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
Questo è sbagliato perché non funziona se il nome del file contiene più caratteri .
. Se, diciamo, ho a.b.js
, considererà a
e b.js
, invece di a.b
e js
.
Si può fare facilmente in Python con
file, ext = os.path.splitext(path)
ma preferirei non accendere un interprete Python solo per questo, se possibile.
Qualche idea migliore?
Per prima cosa, ottenere il nome del file senza il percorso:
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
In alternativa, puoi concentrarti sull'ultimo '/' del percorso invece del '.' che dovrebbe funzionare anche se hai estensioni di file imprevedibili:
filename="${fullfile##*/}"
Potresti voler controllare la documentazione :
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
Per maggiori dettagli, vedere espansione dei parametri della shell nel manuale di Bash.
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js
funziona bene, quindi si può semplicemente usare:
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
I comandi, comunque, funzionano come segue.
Il comando per NOME
sostituisce un carattere "."
seguito da un qualsiasi numero di caratteri non-"."fino alla fine della linea, con niente (cioè, rimuove tutto dal
"."` finale alla fine della linea, incluso). Questa è fondamentalmente una sostituzione non-grida che usa un trucco regex.
Il comando per EXTENSION
sostituisce un qualsiasi numero di caratteri seguito da un carattere "."
all'inizio della riga, con niente (cioè, rimuove tutto dall'inizio della riga al punto finale, incluso). Questa è una sostituzione avida che è l'azione predefinita.