[zsh|sh] obtenir l'extension d'un fichier

Le
unbewusst.sein
pour un fichier "example.ext" je sais comment obtenir le nom du fichier
sans extension:
file="example.ext"

echo ${file:r}

mais comment, au "contraire", n'obtenir que l'extension ?

but de la manip :

convertir "example.ext" en "example_080727_145733.ext"

la partie "_080727_145733" étant obtenue par :
mtime=`stat -f "%m" /Users/yt/Desktop/ssh-scp/ssh_connect.zsh`
mtime_str=`date -r ${mtime} +"_%y%m%d_%H%M%S"`

il faut donc que j'ajoute ce "mtime_str" entre "example" et ".ext"
c'est pour faire un move
--
Une Bévue
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
unbewusst.sein
Le #16419591
Une Bévue
mais comment, au "contraire", n'obtenir que l'extension ?



soit :
file="/Users/yt/Desktop/ssh-scp/ssh_connect.zsh"
sans_extension=${file:r}
extension=${file#$sans_extension}
--
Une Bévue
patpro ~ patrick proniewski
Le #16419651
In article
(Une Bévue) wrote:

Une Bévue
> mais comment, au "contraire", n'obtenir que l'extension ?

soit :
file="/Users/yt/Desktop/ssh-scp/ssh_connect.zsh"
sans_extension=${file:r}
extension=${file#$sans_extension}



ou :

extension=${file##*.}

patpro

--
A vendre : KVM IP 16 ports APC
http://patpro.net/blog/index.php/2008/01/12/133
unbewusst.sein
Le #16419781
patpro ~ patrick proniewski
extension=${file##*.}



effectivement mais j'ai besoin de "sans_extension"
d'ailleurs le :
sans_extension=${file:r}
ne marche pas avec sh (je pense que, pour être "linux compatible", je
dois utiliser sh, que je ne connais pas, plutôt que zsh)

finalement je fais ça :
#!/usr/bin/env sh

echo `which sh`
# -> /bin/sh
file="/Users/yt/Desktop/ssh-scp/ssh_connect.zsh"
mtime=`stat -f "%m" ${file}`
echo $mtime
# -> 1216993582
mtime_str=`date -r ${mtime} +"_%y%m%d_%H%M%S"`
echo $mtime_str
# -> _080725_154622
woext=${file%.*}
echo $woext
# -> /Users/yt/Desktop/ssh-scp/ssh_connect
ext=${file#$woext}
echo $ext
# -> .zsh
nfile="${woext}${mtime_str}${ext}"
echo $nfile
# -> /Users/yt/Desktop/ssh-scp/ssh_connect_080725_154622.zsh

tout ça pour faire un renommage :

mv $file $nfile

je cherche une solution avec le - de variables intermédiaires
possible...

par exemple, je n'ai pas trouvé le moyen de formatter directement mtime
dans mon appel à stat...

et un pipe :
mtime_str=`stat -f "%m" ${file} | date -r +"_%y%m%d_%H%M%S"`

me retourne le 1ier janvier 1970...

--
Une Bévue
Eric Levenez
Le #16420111
Le 27/07/08 15:49, dans
Bévue »
par exemple, je n'ai pas trouvé le moyen de formatter directement mtime
dans mon appel à stat...

et un pipe :
mtime_str=`stat -f "%m" ${file} | date -r +"_%y%m%d_%H%M%S"`

me retourne le 1ier janvier 1970...



Le -r de date attend un argument que tu ne lui passes pas, genre :

date -r 1216233193 "+_%y%m%d_%H%M%S"

Il faut donc que le "stat" soit en argument du "date", par exemple :

date -r `stat -f "%m" $file` "+_%y%m%d_%H%M%S"

Ce qui donne un truc (hideux) du genre :

mtime_str="`date -r `stat -f "%m" $file` "+_%y%m%d_%H%M%S"`"

Après, il faut regarder tous les cas particuliers pour traiter les
caractères spéciaux des chaînes. Le shell n'est pas fait pour cela.
Le mieux étant encore Perl pour faire ce que tu veux.

--
Éric Lévénez -- Unix is not only an OS, it's a way of life.
unbewusst.sein
Le #16420251
Eric Levenez
Le -r de date attend un argument que tu ne lui passes pas, genre :

date -r 1216233193 "+_%y%m%d_%H%M%S"



ouais, c'est ce que j'avais intuité en essayant de mettre le -r à la fin
des arguments, mais date n'en veut pas ainsi...


Il faut donc que le "stat" soit en argument du "date", par exemple :

date -r `stat -f "%m" $file` "+_%y%m%d_%H%M%S"

Ce qui donne un truc (hideux) du genre :

mtime_str="`date -r `stat -f "%m" $file` "+_%y%m%d_%H%M%S"`"



pourquoi mets-tu la commande date entre quotes ?
mtime_str=`date -r `stat -f "%m" $file` "+_%y%m%d_%H%M%S"`
c'est pas bon ?

Après, il faut regarder tous les cas particuliers pour traiter les
caractères spéciaux des chaînes. Le shell n'est pas fait pour cela.
Le mieux étant encore Perl pour faire ce que tu veux.



oui, OK, chez moi, en tout cas, je n'ai pas de caractères spéciaux dans
les chaines relatives aux pathes...

--
Une Bévue
patpro ~ patrick proniewski
Le #16420351
In article
(Une Bévue) wrote:

patpro ~ patrick proniewski
> extension=${file##*.}

effectivement mais j'ai besoin de "sans_extension"
d'ailleurs le :
sans_extension=${file:r}
ne marche pas avec sh (je pense que, pour être "linux compatible", je
dois utiliser sh, que je ne connais pas, plutôt que zsh)



en même temps, sous linux comme sous pas mal d'autres OS, sh n'est plus
qu'un avatar de bash.

file="/Users/yt/Desktop/ssh-scp/ssh_connect.zsh"
mtime=`stat -f "%m" ${file}`



ne fonctionnera pas sous linux, stat n'a pas les mêmes options.

echo $mtime
# -> 1216993582
mtime_str=`date -r ${mtime} +"_%y%m%d_%H%M%S"`



marchera pas sous linux, date ne fonctionne vraiment pas pareil.

echo $mtime_str
# -> _080725_154622
woext=${file%.*}
echo $woext
# -> /Users/yt/Desktop/ssh-scp/ssh_connect
ext=${file#$woext}
echo $ext
# -> .zsh
nfile="${woext}${mtime_str}${ext}"
echo $nfile
# -> /Users/yt/Desktop/ssh-scp/ssh_connect_080725_154622.zsh

tout ça pour faire un renommage :

mv $file $nfile

je cherche une solution avec le - de variables intermédiaires
possible...

par exemple, je n'ai pas trouvé le moyen de formatter directement mtime
dans mon appel à stat...



man stat.
Sur Mac OS X 10.5 et FreeBSD c'est :

stat -f "%Sm" -t "_%y%m%d_%H%M%S" ton_fichier

Sur linux c'est autrement.


patpro

--
A vendre : KVM IP 16 ports APC
http://patpro.net/blog/index.php/2008/01/12/133
unbewusst.sein
Le #16420411
patpro ~ patrick proniewski
> d'ailleurs le :
> sans_extension=${file:r}
> ne marche pas avec sh (je pense que, pour être "linux compatible", je
> dois utiliser sh, que je ne connais pas, plutôt que zsh)

en même temps, sous linux comme sous pas mal d'autres OS, sh n'est plus
qu'un avatar de bash.

> file="/Users/yt/Desktop/ssh-scp/ssh_connect.zsh"
> mtime=`stat -f "%m" ${file}`

ne fonctionnera pas sous linux, stat n'a pas les mêmes options.

> echo $mtime
> # -> 1216993582
> mtime_str=`date -r ${mtime} +"_%y%m%d_%H%M%S"`

marchera pas sous linux, date ne fonctionne vraiment pas pareil.



bon, quelqu'un d'autre fera l'adaptation à linux.

>
> par exemple, je n'ai pas trouvé le moyen de formatter directement mtime
> dans mon appel à stat...

man stat.
Sur Mac OS X 10.5 et FreeBSD c'est :

stat -f "%Sm" -t "_%y%m%d_%H%M%S" ton_fichier



ben j'ai ouvert le man stat (BSD May 8, 2003) je n'y trouve pas le -t...

et chez moi (10.4.11) la commande stat ignore, silencieusement, -t
"_%y%m%d_%H%M%S"
et me retourne les secondes since epoch...


--
Une Bévue
unbewusst.sein
Le #16420481
Erwan David

Non. Par exemple sur une debian ça peut être un dash, et utiliserf des
bashisme dans un script commençant par /bin/sh est un bug



sur mon tél portable (noyau 2.4.x) je n'ai qu'un sh et sans page de
man...
--
Une Bévue
Eric Levenez
Le #16420541
Le 27/07/08 17:19, dans
Bévue »
Eric Levenez
mtime_str="`date -r `stat -f "%m" $file` "+_%y%m%d_%H%M%S"`"



pourquoi mets-tu la commande date entre quotes ?



Par habitude.

mtime_str=`date -r `stat -f "%m" $file` "+_%y%m%d_%H%M%S"`
c'est pas bon ?



Si c'est bon, mais ça permet de faire, sans avoir à réécrire tout :

mtime_str="aaa `date -r `stat -f "%m" $file` "+_%y%m%d_%H%M%S"` bbb"

Après, il faut regarder tous les cas particuliers pour traiter les
caractères spéciaux des chaînes. Le shell n'est pas fait pour cela.
Le mieux étant encore Perl pour faire ce que tu veux.



oui, OK, chez moi, en tout cas, je n'ai pas de caractères spéciaux dans
les chaines relatives aux pathes...



C'est ce que l'on pense, et puis un jour il y a un blanc, et là on efface
tout le disque dur. Demande à Apple lors d'une célèbre mise à jour...

--
Éric Lévénez -- Unix is not only an OS, it's a way of life.
Eric Levenez
Le #16420531
Le 27/07/08 18:03, dans « patpro ~ patrick proniewski »
en même temps, sous linux comme sous pas mal d'autres OS, sh n'est plus
qu'un avatar de bash.



Sh doit être un shell de type Bourne, c'est tout. Si le système est Posix,
le shell doit être conforme à la norme.

--
Éric Lévénez -- Unix is not only an OS, it's a way of life.
Publicité
Poster une réponse
Anonyme