OVH Cloud OVH Cloud

Bash

17 réponses
Avatar
Olivier V
Bonjour,

Y a-t-il sous bash une commande permettant de récupérer :
- le nom d'un fichier sans son extension ?
- l'extension d'un fichier sans son nom ?
- le chemin d'un fichier ?

Je souhaiterais en effet créer un petit script qui facilite la décompression
de fichiers OpenOffice .sxw
et je n'y connais rien en bash ...

Cela se présenterait comme cela :

#!/bin/sh
mkdir mon_fichier(sans l'extension) ;
cd mon_fichier(sans l'extension);
unzip mon_fichier.extension;

La seule chose que je sache est qu'un argument s'appelle avec $1 ...

Merci

Olivier V

7 réponses

1 2
Avatar
Stephane Chazelas
2004-10-21, 16:04(+02), Olivier V:
[...]
mkdir "${1%.sxw}"
unzip -d "${1%.sxw}" "$1"


Manque un "--" apres mkdir et avant "$1"


Cela donne donc :

#!/bin/sh
mkdir --"${1%.sxw}" "--" #qui ne sert à rien ...


mkdir -- "${1%.sxw}"

Sans quoi tu ne pourra pas creer un repertoire qui commence par
un "-" (ou un "+" dans certains cas). Pour tout ce qu'il y a
avant le "--", il y a des contraintes de format des arguments,
on ne peut donc pas mettre de variable (de donnee exterieure au
script plutot)

--
Stephane



Avatar
Nicolas George
"TiChou" wrote in message :
Faudrait peut être nuancer... Ce n'est pas, l'utilisation de && et de || qui
fait que ça ne fonctionne pas mais plutôt parce que j'ai commis une (petite)
erreur dans mon code.


Disons que l'usage de || et && dans les cas non-triviaux est plus propice
aux erreurs.

Vous vous souciez précédement de la lisibilité du code, point sur lequel je
suis assez d'accord avec vous si on s'adresse à un débutant. Seulement je
vois qu'ici vous faites usage de la commande 'printf', qui certes a ses
avantages dans de nombreux cas mais guère ici. Pensez-vous alors que la
syntaxe de la commande 'printf' est ici beaucoup plus lisible que la
commande echo ? Où est-ce juste un excès de zèle ? ;)


La commande echo est totalement imprévisible dès qu'elle a affaire a un - en
début d'argument ou un quelque part, et probablement d'autres cas
bizarres. Pour afficher un message constant, ça passe, mais dès qu'il y a
une donnée extérieure, ça peut donner des résultats bizarres. Évidemment, ce
n'est pas bien grave, et celui qui appelle son fichier « -en » cherche les
coups, mais on est perfectionniste ou un ne l'est pas.

À noter qu'avec zsh, echo est un builtin, de comportement prévisible :-Þ

Avatar
Olivier V
Merci à tous pour vos explications.

Mais pour la ligne unzip, c'est bien
unzip -d "${1%.sxw}" "$1"
? pas de -- si j'ai compris ?



Je dispose don des deux scripts suivants :

version basique

#!/bin/sh
mkdir -- "${1%.sxw}"
unzip -d "${1%.sxw}" "$1"

et version élaborée :

#!/bin/bash
[ -f "$1" ] || { echo "$1 n'est pas un fichier" >&2 ; exit 1 ; }
[ "${1%.*}.sxw" != "$1" ] && echo "$1 n'est pas un fichier .sxw" >&2 && exit
1
mkdir -- "${1%.sxw}"
unzip -d "${1%.sxw}" "$1"

par contre le troisième ne fonctionne pas.

Enfin, tout cela me va très bien !

Olivier V
Avatar
Stephane Chazelas
2004-10-21, 20:40(+02), Olivier V:
Merci à tous pour vos explications.

Mais pour la ligne unzip, c'est bien
unzip -d "${1%.sxw}" "$1"
? pas de -- si j'ai compris ?
[...]


Ben si. Comme j'ai dit, la ou se trouve "$1" au dessus, unzip
n'a pas moyen de savoir si c'est une option ou un fichier si le
nom du fichier commence par "-"

unzip -d "${1%.sxq}" -- "$1"

--
Stephane

Avatar
Stephane Chazelas
2004-10-21, 14:37(+00), Nicolas George:
[...]
La commande echo est totalement imprévisible dès qu'elle a affaire a un - en
début d'argument ou un quelque part, et probablement d'autres cas
bizarres.
[...]


Bah, c'est deja pas mal. Il y aura des "echo" qui ne marcheront
plus avec une liste d'arguments trop grande, mais on peut en
dire autant de printf.

À noter qu'avec zsh, echo est un builtin, de comportement prévisible :-Þ


Il est builtin dans la plupart des shells. Mais contrairement a
bash ou a ksh, son comportement ne depend pas des options de
compilations du shell ou de l'environnement.

zsh supporte:

echo -E - $var

mais aussi

print -r -- $var

comme ksh. J'aurais trouvé plus logique que -r soit l'option par
defaut et qu'il faille un disont -e pour activer l'expansion des
t, n... mais bon.

printf n'est builtin dans zsh que depuis les versions 4.1.

--
Stephane

Avatar
Stephane Chazelas
2004-10-21, 16:27(+02), TiChou:
[...]
if [ ! -f "$1" ]; then
printf > &2 '"%s" n'''est pas un fichier regulier' "$1"


printf > &2 '"%s" n'''est pas un fichier reguliern' "$1"


Me semble pas que j'aie ecris "> &2" qui n'est pas portable.

Vous vous souciez précédement de la lisibilité du code, point sur lequel je
suis assez d'accord avec vous si on s'adresse à un débutant. Seulement je
vois qu'ici vous faites usage de la commande 'printf', qui certes a ses
avantages dans de nombreux cas mais guère ici.


Voir le post de Nicolas George.

Pensez-vous alors que la
syntaxe de la commande 'printf' est ici beaucoup plus lisible que la
commande echo ? Où est-ce juste un excès de zèle ? ;)


"echo" est une commande a bannir d'apres la "Single Unix
Specification", et c'est une des moins portables.

--
Stephane


Avatar
Olivier V
ok merci

Olivier V
1 2