OVH Cloud OVH Cloud

re- scripts pour debutant ...

16 réponses
Avatar
yannick.deglin
j'apprends doucement mais surement .....

voila .. j'ai 2 nouveaux hic ...

(solaris / ksh)


-Comment faire pour selectionner dans un repertoire un fichier qui
commence par toto et dont la date est la plus recente ....

disons que j'ai un repertoire
Data/

et dans ce repertoire des fichiers du type

toto_var1_var2_Date1.txt
toto_var1_var2_Date2.txt
toto_var1_var2_Date3.txt
tata_var1_var2_date4.txt

je veux chercher le fichier commencant par toto et le plus recent ...
en recuperant bien sur les variables toto, var1, var2 et date ...




- ensuite , est -il possible, sur unix, de lancer un script dès qu'un
nouveau fichier arrive dans un repertoire ????




merci beaucoup ;-)

10 réponses

1 2
Avatar
Rakotomandimby (R12y) Mihamina
Bonjour.

( Thu, 16 Dec 2004 10:04:11 -0800 ) sleepee :
-Comment faire pour selectionner dans un repertoire un fichier qui
commence par toto et dont la date est la plus recente ....


Est ce que la "date" que tu veux correspont a l'attribut "date" du
fichier ? (celui qui n'a rien a voir avec le nom du fichier).

Quel est le format de la date ? jj-mm-aaa ? est ce qu'il y a des lettres
ou tout n'est qye chiffres ?
--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)

Avatar
Christian CAMIER
sleepee wrote:
j'apprends doucement mais surement .....

voila .. j'ai 2 nouveaux hic ...

(solaris / ksh)


-Comment faire pour selectionner dans un repertoire un fichier qui
commence par toto et dont la date est la plus recente ....

disons que j'ai un repertoire
Data/

et dans ce repertoire des fichiers du type

toto_var1_var2_Date1.txt
toto_var1_var2_Date2.txt
toto_var1_var2_Date3.txt
tata_var1_var2_date4.txt

je veux chercher le fichier commencant par toto et le plus recent ...
en recuperant bien sur les variables toto, var1, var2 et date ...


# Option -t du ls == tri en ordre décroissant de date
# Option -l du ls == affichage long
ls -lt toto* |
awk '
# On dégage la première ligne et les répertoires
FNR == 1 || /^d/ {
next;
}
# La première ligne qui passe ici est le fichier
# le plus récent
{
# On affiche:
# nomfichier (mois jour heure)
# Note, cela ne fonctionne qu'avec les fichiers
# de l'année, sinon prendre en compte cas ou année
# aussi affichée (1 champ de +)
print $9 " (" $6 " " $7 " " $8 ")";
exit;
}'

- ensuite , est -il possible, sur unix, de lancer un script dès qu'un
nouveau fichier arrive dans un repertoire ????
Question récurente dans le monde des intégrateurs applicatifs :)

La réponse est malheureusement "NON". Il faut écrire un petit programme
qui peut très bien être un script shell, lisant régulièrement le
répertoire et comparant avec le dernier résultat.

merci beaucoup ;-)


De rien

Avatar
Rakotomandimby (R12y) Mihamina
( Thu, 16 Dec 2004 21:19:41 +0100 ) Christian CAMIER :
Question récurente dans le monde des intégrateurs applicatifs :) La
réponse est malheureusement "NON".


Sur la Mailing list de mon ancien FileManager (rox), j'ai eu cette
reponse:
(Elle n'a pas vraiment de rapport, mais c'est peut-etre une piste pour
voir un le contenu d'un repertoire donné "evolue")

__________________________________________________
Rakotomandimby (R12y) Mihamina wrote:
Hello,
I'm downloading a large file from internet and if I change to the
directory the file is downloaded in, Rox is refreshing too much often,
so that it blinks.
How do I set the refresh rate to 10 or more seconds ?


On linux, the Filer uses dnotify to perform rescans. This is a kernel
feature that lets applications know when files have changed. There is no
mechanism to change the timing of this.

However, I do not see this problem on my system using firefox. Can you
provide more information about your setup? (OS and version, app, filer
version, etc)
_______________________________________________________

--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)

Avatar
Nicolas George
R12y wrote in message :
On linux, the Filer uses dnotify to perform rescans. This is a kernel
feature that lets applications know when files have changed.


Ouh, mais c'est intéressant, ça. Pour ceux qui voudraient économiser grep,
c'est documenté dans Documentation/dnotify.txt dans les sources du noyau
(avec un exemple minimaliste), ainsi que dans la page de man de fcntl(2), le
flag F_NOTIFY.

Ceci dit, sans ça, on n'est en général pas obligé de relire le répertoire
fréquemment : on peut tester si son ctime a été modifié, et ne le relire que
dans ce cas.

Avatar
Rakotomandimby (R12y) Mihamina
( Thu, 16 Dec 2004 23:08:49 +0000 ) Nicolas George :
Ouh, mais c'est intéressant, ça.


<grand grand sourire>
Pour une fois que je peux servir a quelquechose ...
--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)

Avatar
Stephane Chazelas
2004-12-16, 10:04(-08), sleepee:
j'apprends doucement mais surement .....

voila .. j'ai 2 nouveaux hic ...

(solaris / ksh)


-Comment faire pour selectionner dans un repertoire un fichier qui
commence par toto et dont la date est la plus recente ....
[...]


zsh -c 'print -rl toto*(om[1])'

perl -le 'print ((sort { -M $a <=> -M $b } <toto*>)[1])'

Ou si les noms de fichiers ne contiennent pas de sauts de ligne:

ls -dt -- toto* | head -1

S'ils peuvent contenir des sauts de ligne:

IFS=/
set -f
set -- $(set +f; ls -dt ./toto*; echo ./)
printf '%sn' "${2%??}"

Ces deux dernieres solutions peuvent ne pas marcher s'il y a
trop de fichiers toto.

--
Stephane

Avatar
drkm
Etienne de Tocqueville <et+ writes:

ls | grep "^toto" | xargs echo |
while read line; do ls -dt $line | head -1; done |
xargs ls -dt | head -1


« ... | xargs echo | ... », ça sert à quoi ?

--drkm

Avatar
Stephane Chazelas
2004-12-17, 15:48(+01), drkm:
Etienne de Tocqueville <et+ writes:

ls | grep "^toto" | xargs echo |
while read line; do ls -dt $line | head -1; done |
xargs ls -dt | head -1


« ... | xargs echo | ... », ça sert à quoi ?
[...]


Je pense qu'il s'agit d'une blague qui rassemble un peu tous les
trucs a ne pas faire en shell.

Si les noms de fichiers ne contiennent pas de sauts de ligne:

ls -t | grep '^toto' | head -1

ou

ls -t | sed '/^toto/!d/q'

(ou avec le GNU grep:
ls -t | grep -m1 '^toto')

S'ils peuvent contenir des sauts de ligne et peuvent etre trop
nombreux, ca devient tres compliqué, voire tres tres compliqué
avec certains shells.

--
Stephane


Avatar
DominiX
ici même:Stephane Chazelas a écrit
2004-12-16, 10:04(-08), sleepee:
j'apprends doucement mais surement .....

voila .. j'ai 2 nouveaux hic ...

...



-Comment faire pour selectionner dans un repertoire un fichier qui
commence par toto et dont la date est la plus recente ....
[...]



perl -le 'print ((sort { -M $a <=> -M $b } <toto*>)[1])'



perl -le 'print ((sort { -M $a <=> -M $b } <toto*>)[0])'
mes 0.2 cents ^^^


-- dominix


Avatar
Stephane Chazelas
2004-12-20, 08:39(+01), Etienne de Tocqueville:
Stephane Chazelas writes:

ls | grep "^toto" | xargs echo |
while read line; do ls -dt $line | head -1; done |
xargs ls -dt | head -1
[...]




Je pense qu'il s'agit d'une blague qui rassemble un peu tous les
trucs a ne pas faire en shell.


Pourquoi « des trucs à ne pas faire » ? Bien sur, dans le cas présent,
il y avait plus simple, mais c'était pour dire que s'il y a trop de
donner pour être traité d'un coup par une commande, il y a toujours
possibilité de les traiter par blocs. Il m'est déjà arrivé d'avoir une
liste de fichier non triée par date, et d'en vouloir le plus plus
récent, ou les N plus récents.


Les trucs a ne pas faire:

ls |


postprocesser ls (dans l'absolu)

| xargs


utiliser xargs sur un input qui n'a pas ete mis au bon format.

echo |


utiliser echo.

while read line


utiliser une boucle while read, utiliser read sans -r et sans
changer IFS.

do ls -dt $line


variable non-quotee, pas de -- pour separer options des
arguments.

| head -1; done |
xargs ls -dt | head -1





Ce deuxieme xargs peut tres bien lancer plusieurs ls et le
resultat ne sera pas correct alors.

A la limite, on pouvait faire:

IFS='
'
set -f
ls -dt -- $(ls -f | sed '/^toto/!d;s/./&/g' | xargs sh -c '
shift "$1"
[ "$#" -eq 0 ] && exit
ls -dt -- "$@" | head -1' 2 1) | head -1

--
Stephane




1 2