224 votes

Comment supprimer l'extension d'un nom de fichier dans un shell script ?

Quel est le problème avec le code suivant ?

name='$filename | cut -f1 -d'.''

Tel quel, j'obtiens la chaîne littérale $filename | cut -f1 -d'.' mais si j'enlève les guillemets, je n'obtiens rien. Pendant ce temps, en tapant

"test.exe" | cut -f1 -d'.'

dans un shell me donne la sortie que je veux, test . Je sais déjà $filename s'est vu attribuer la bonne valeur. Ce que je veux faire, c'est affecter à une variable le nom du fichier sans l'extension.

406voto

chepner Points 54078

Vous pouvez également utiliser l'expansion des paramètres :

$ filename=foo.txt
$ echo "${filename%.*}"
foo

Sachez simplement que s'il n'y a pas d'extension de fichier, il cherchera des points plus loin dans le passé, par ex.

  • Si le nom du fichier ne commence que par un point (par ex. .bashrc ), il supprimera le nom de fichier entier.
  • S'il n'y a qu'un point dans le chemin (ex. path.to/myfile ou ./myfile ), alors il sera coupé à l'intérieur du chemin.

170voto

Rohan Points 22386

Vous devriez utiliser le substitution de commande syntaxe $(command) lorsque vous voulez exécuter une commande dans script/command.

Donc votre ligne serait

name=$(echo "$filename" | cut -f 1 -d '.')

Explication du code :

  1. echo obtenir la valeur de la variable $filename et l'envoyer à la sortie standard
  2. Nous récupérons ensuite la sortie et la transmettons à la section cut commande
  3. Le site cut utilisera le . comme délimiteur (également connu sous le nom de séparateur) pour découper la chaîne en segments et par -f nous sélectionnons le segment que nous voulons avoir en sortie
  4. Ensuite, le $() la substitution de commande obtiendra la sortie et retournera sa valeur
  5. La valeur renvoyée sera affectée à la variable nommée name

Notez que ceci donne la partie de la variable jusqu'à la première période . :

$ filename=hello.world
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello.hello.hello
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello
$ echo "$filename" | cut -f 1 -d '.'
hello

163voto

Steven Penny Points 18523

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

$ basename /home/jsmith/base.wiki .wiki
base

38voto

manish_s Points 1045

Si votre nom de fichier contient un point (autre que celui de l'extension), utilisez ceci :

echo $filename | rev | cut -f 2- -d '.' | rev

26voto

Raghwendra Points 269
file1=/tmp/main.one.two.sh
t=$(basename "$file1")                        # output is main.one.two.sh
name=$(echo "$file1" | sed -e 's/\.[^.]*$//') # output is /tmp/main.one.two
name=$(echo "$t" | sed -e 's/\.[^.]*$//')     # output is main.one.two

utilisez celui que vous voulez. Ici, je suppose que le dernier . (point) suivi du texte est une extension.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X