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

10 réponses

1 2
Avatar
Nicolas George
Olivier V wrote in message :
Y a-t-il sous bash une commande permettant de récupérer :


Avec zsh, qui est infiniment meilleur que bash :

- le nom d'un fichier sans son extension ?


${fichier:r}

À combiner éventuellement avec :r, pour donner ${fichier:r:t}.

- l'extension d'un fichier sans son nom ?


${fichier:e}

- le chemin d'un fichier ?


${fichier:h}

Cf. zshexpn(1) pour plus de détails.

Avatar
françois
Olivier V wrote:
Bonjour,


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 ...



man, google , librairie .....

Merci

Olivier V


Avatar
Olivier V
françois wrote:

google ...


Essayé et rien trouvé en dehors des commandes ordinaires (cp, cd ...)

Avatar
TiChou
Dans le message <news:,
*Olivier V* tapota sur f.c.o.l.configuration :

Bonjour,


Bonsoir,

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 ?


$ arg=/chemin/fichier.extension

En bash :

$ echo ${var##*/}
fichier.extension

$ echo ${var%/*}
/chemin

$ echo ${var%.*}
/chemin/fichier

Avec les commandes 'basename' et 'dirname' :

$ basename "$var"
fichier.extension

$ dirname "$var"
/chemin

$ basename "$var" .extension
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;


#!/bin/sh

PATH="/usr/local/bin:/usr/bin:/bin"

[ -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}"
cd "${1%.sxw}"
unzip "$1"

(non testé)

Merci


De rien.

--
TiChou

Avatar
TiChou
Dans le message <news:,
*TiChou* tapota sur f.c.o.l.configuration :

#!/bin/sh
^^

#!/bin/bash serait préférable...

--
TiChou

Avatar
Olivier V
TiChou wrote:

J'ai le script suivant qui fonctionne grâce à vos précieuse indications :

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

(ce que j'avais mis avec "cd" était évidemment incorrecte, puisque le
répertoir créé ne contenait pas le fichier à dézipper).

Par contre votre script modifié ne me donne rien en sortie : ??

#!/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"

Olivier V
Avatar
Stephane Chazelas
2004-10-21, 14:14(+02), Olivier V:
[...]
#!/bin/sh
mkdir "${1%.sxw}"
unzip -d "${1%.sxw}" "$1"


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

Note que unzip creera le repertoire s'il n'existe pas de toutes
facons avec "-d".

[...]
Par contre votre script modifié ne me donne rien en sortie : ??

#!/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"
[...]


Rien d'etonnant. On veut s'economiser du temps en utilisant &&
et || et ca devient moins lisible et surtout ca ne marche pas.


[ -f "$1" ] || echo "$1 n'est pas un fichier" >&2 && exit 1

doit etre lu:

( [ -f "$1" ] || echo "$1 n'est pas un fichier" >&2 ) && exit 1

Donc, le "exit 1" sera toujours executé.

#!/bin/sh -

PATH=$(/usr/bin/getconf PATH)

if [ "$#" -ne 1 ]; then
echo "Usage: ..." >&2
exit 1
fi

if [ ! -f "$1" ]; then
printf >&2 '"%s" n'''est pas un fichier regulier' "$1"
exit 1
fi

case $1 in
*.sxw)
if mkdir -- "${1%.sxw}"; then
unzip -d "${1%.sxw}" -- "$1"
else
exit 1
fi;;
*)
printf >&2 '"%s" n'''est pas un fichier .sxw' "$1"
exit 1;;
esac

(pas testé)

--
Stephane

Avatar
Olivier V
Stephane Chazelas wrote:

2004-10-21, 14:14(+02), Olivier V:
[...]
#!/bin/sh
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 ...
unzip -d "${1%.sxw}" "--" "$1"

Mais à quoi cela servent les "--" ? Je ne vois par exemple rien dans le
manuel de mkdir ...

Note que unzip creera le repertoire s'il n'existe pas de toutes
facons avec "-d".



Effectivement ce qui suit fonctionne aussi :

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


#!/bin/sh -

PATH=$(/usr/bin/getconf PATH)

if [ "$#" -ne 1 ]; then
echo "Usage: ..." >&2
exit 1
fi

if [ ! -f "$1" ]; then
printf >&2 '"%s" n'''est pas un fichier regulier' "$1"
exit 1
fi

case $1 in
*.sxw)
if mkdir -- "${1%.sxw}"; then
unzip -d "${1%.sxw}" -- "$1"
else
exit 1
fi;;
*)
printf >&2 '"%s" n'''est pas un fichier .sxw' "$1"
exit 1;;
esac

(pas testé)


Cela ne fonctionne pas, et je ne suis pas en mesure de corriger ...
Pas d'erreur, mais rien en sortie.

Olivier V


Avatar
Nicolas George
Olivier V wrote in message :
Mais à quoi cela servent les "--" ?


À faire en sorte que les arguments suivants soit considérés comme des
arguments et pas des options. C'est pratique quand on veut supprimer un
fichier qui s'appelle -rf (même si là, l'astuce terre à terre ./-rf
fonctionne...).

Avatar
TiChou
Dans le message <news:,
*Stephane Chazelas* tapota sur f.c.o.l.configuration :

Par contre votre script modifié ne me donne rien en sortie : ??

#!/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"
[...]


Rien d'etonnant. On veut s'economiser du temps en utilisant && et ||


Je ne vois pas en quoi... C'est une syntaxe couramment utilisé surtout dans
le cas de test court et simple.

et ca devient moins lisible


Pour vous peut être.

et surtout ca ne marche pas.


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.

[ -f "$1" ] || echo "$1 n'est pas un fichier" >&2 && exit 1

doit etre lu:

( [ -f "$1" ] || echo "$1 n'est pas un fichier" >&2 ) && exit 1


Devrait plutôt être lu comme :

{ [ -f "$1" ] || echo "$1 n'est pas un fichier" >&2 ; } && exit 1

Non ?

Donc, le "exit 1" sera toujours executé.


Je corrige donc mon erreur :

[ -f "$1" ] || { echo "$1 n'est pas un fichier" >&2 ; exit 1 ; }

#!/bin/sh -

PATH=$(/usr/bin/getconf PATH)

if [ "$#" -ne 1 ]; then
echo "Usage: ..." >&2
exit 1
fi

if [ ! -f "$1" ]; then
printf > &2 '"%s" n'''est pas un fichier regulier' "$1"


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

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 ? ;)

--
TiChou


1 2