La commande basename a deux invocations différentes; dans l'un, vous spécifiez uniquement le chemin, auquel cas il vous donne le dernier composant, tandis que dans l'autre, vous donnez également un suffixe qu'il supprimera. Ainsi, vous pouvez simplifier votre exemple de code en utilisant la deuxième invocation de basename. Faites également attention à bien citer les choses :
fbname=$(basename "$1" .txt) echo "$fbname"
Voici les oneliners :
$(basename "${s%.*}")
$(basename "${s}" ".${s##*.}")
J'avais besoin de ça, comme demandé par bongbang et w4etwetewtwet.
Vous n'avez pas besoin d'appeler le basename
externe commande. À la place, vous pouvez utiliser les commandes suivantes :
$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo
Notez que cette solution devrait fonctionner dans toutes les versions récentes (post 2004 ) POSIX coques conformes, (par exemple bash
, dash
, ksh
, etc.).
Source :Shell Command Language 2.6.2 Extension des paramètres
En savoir plus sur les manipulations de chaînes bash :http://tldp.org/LDP/LG/issue18/bash.html
Une combinaison de nom de base et de coupe fonctionne bien, même en cas de double fin comme .tar.gz
:
fbname=$(basename "$fullfile" | cut -d. -f1)
Ce serait intéressant si cette solution nécessitait moins de puissance arithmétique que l'expansion des paramètres de Bash.