Come estrarre il nome file senza l'estensione da un percorso completo?


10

Sto cercando di correggere il mio primo script bash, e ad un certo punto un nome file viene passato allo script come $1. Devo estrarre il nome del file senza l'estensione.
Attualmente, suppongo che tutte le estensioni siano di tre lettere, quindi rimuovo gli ultimi 4 caratteri per ottenere il nome del file:

a="${1:0:-4}"

Ma devo essere in grado di lavorare con estensioni che hanno più di tre caratteri, come %~n1in Windows.
Esiste un modo per estrarre il nome del file senza l'estensione dagli argomenti?


Risposte:


27

Il solito modo per farlo in bash è usare l'espansione dei parametri. (Vedi la pagina man di bash e cerca "Parameter Expansion".)

a=${1%.*}

La %indica che tutto ciò che corrisponde al modello seguente ( .*) da destra, con la partita più breve possibile, deve essere cancellata dal parametro $1. In questo caso, non hai bisogno delle doppie virgolette (") attorno all'espressione.


1
I modelli di file sono generalmente così: "Something.eng.ext". Ovviamente in questo caso ext è l'estensione, ma usando $ {1%. *} Restituirà solo la parte "Something", giusto?
user304822

2
No. ${1%.*}tornerà Something.eng. Se si desidera rimuovere tutto a destra del primo, .incluso il ., utilizzare ${1%%.*}, che verrà restituito Something.
garyjohn,


0

One-liner in Bash senza usare basename :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.