Comment extraire le nom de fichier sans l'extension d'un chemin complet?

10

J'essaye de redresser mon premier script bash, et à un moment donné un nom de fichier est passé au script comme $1. J'ai besoin d'extraire le nom du fichier sans l'extension.
Actuellement, je suppose que toutes les extensions sont de trois lettres, donc je supprime les 4 derniers caractères pour obtenir le nom du fichier:

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

Mais je dois pouvoir travailler avec des extensions qui ont plus de trois caractères, comme %~n1dans Windows.
Existe-t-il un moyen d'extraire le nom du fichier sans l'extension des arguments?

user304822
la source
stackoverflow.com/questions/2664740/…
sancho.s ReinstateMonicaCellio

Réponses:

27

La façon habituelle de le faire dans bash est d'utiliser l'expansion des paramètres. (Consultez la page de manuel bash et recherchez «Expansion des paramètres».)

a=${1%.*}

Le %indique que tout ce qui correspond au modèle suivant ( .*) de droite, en utilisant la correspondance la plus courte possible, doit être supprimé du paramètre $1. Dans ce cas, vous n'avez pas besoin de guillemets (") autour de l'expression.

garyjohn
la source
1
Les modèles de fichiers sont généralement comme ceci: "Something.eng.ext". Évidemment, dans ce cas, ext est l'extension, mais l'utilisation de $ {1%. *} Ne retournera que la partie "Something", non?
user304822
2
Non ${1%.*}reviendra Something.eng. Si vous souhaitez supprimer tout à droite du premier, .y compris le ., utilisez ${1%%.*}, qui reviendra Something.
garyjohn
13

Si vous connaissez l'extension, vous pouvez utiliser le nom de base

$ basename /home/jsmith/base.wiki .wiki
base
Steven Penny
la source
0

One-liner dans Bash sans utiliser de nom de base :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
LuckyDams
la source