Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

28 réponses
Avatar
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

10 réponses

1 2 3
Avatar
unbewusst.sein
Une Bévue wrote:

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
Avatar
patpro ~ patrick proniewski
In article
<1ikqsy1.1pxq60a133vi0N%,
(Une Bévue) wrote:

Une Bévue wrote:

> 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
Avatar
unbewusst.sein
patpro ~ patrick proniewski wrote:

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
Avatar
Eric Levenez
Le 27/07/08 15:49, dans
<1ikqu34.1jzuafb1v5dnupN%, « Une
Bévue » a écrit :

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 -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Avatar
unbewusst.sein
Eric Levenez wrote:

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
Avatar
patpro ~ patrick proniewski
In article
<1ikqu34.1jzuafb1v5dnupN%,
(Une Bévue) wrote:

patpro ~ patrick proniewski wrote:

> 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
Avatar
unbewusst.sein
patpro ~ patrick proniewski wrote:

> 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
Avatar
unbewusst.sein
Erwan David wrote:


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
Avatar
Eric Levenez
Le 27/07/08 17:19, dans
<1ikqya8.1lvb5aiieztdiN%, « Une
Bévue » a écrit :

Eric Levenez wrote:

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 -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Avatar
Eric Levenez
Le 27/07/08 18:03, dans ,
« patpro ~ patrick proniewski » a écrit :

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 -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
1 2 3