#1 Le 18/10/2009, à 19:55
- pasa88
aide pour la creation d'un script
Bonsoir a tous !
Je sais que avec les scripts on peut faire de tout et du n'importe quoi.
Voila ce que j'aimerais faire. Je veut créer un script qui me transféré les fichiers du dossier A vers le dossier X,Y,Z , de façon périodique (disons tous les heures). Si possible , j'aimerais qu'il trie les fichiers selon l'extension de fichier.
Par exemple:
Si le fichier est un .avi qu'il soit transféré vers le dossier X
Si le fichier est un .mp3 ou .ogg , qu'il soit transféré vers Y
si le fichier est un .odt, .odp , qu'il soit transféré vers Z
J'aimerais aussi que les fichiers du dossier A soient écrasés ou effacés après le transfert.
P.S Le script tournera comme daemon.
Voila , j'espère que j'étais explicite et que je demande pas trop des conditions.
Si possible je veut non seulement faire fonctionner le script , mais aussi de le comprendre.
J'ai commencé avec les bases présentés ici: http://doc.ubuntu-fr.org//tutoriel/script_shell?redirect=1
merci pour votre aide
J'aime pas les signatures.....et alors?
Linux user #494088
http://www.aru2l.tuxfamily.org/
Hors ligne
#2 Le 18/10/2009, à 21:39
- ChRiiS
Re : aide pour la creation d'un script
Salut pasa88,
Bon c'est fait en speed et c'est pas testé mais ça devrait "marchouiller"
#!/bin/bash
TEMPO=15 # Temps d'attente entre 2 passes
DEPOT="/home/chriis/Bureau/bash/depot/" #Chemin vers le répertoire "A ranger"
SAVES="/home/chriis/Bureau/bash/saves/" #Chemin vers le répertoire rangé
SAVES_X="$SAVES/x/" #Chemin vers X
SAVES_Y="$SAVES/y/" #Chemin vers Y
SAVES_Z="$SAVES/z/" #Chemin vers Z
PATERN_X=".(avi)" #Masque pour X
PATERN_Y=".(mp3|ogg)" #Masque pour Y
PATERN_Z=".(odt|odp)" #Masque pour Z
IFS='
'
while [ 1 ]
do
for i in $(ls $DEPOT | egrep -i "$PATERN_X")
{
mv "$DEPOT$i" $SAVES_X
}
for i in $(ls $DEPOT | egrep -i "$PATERN_Y")
{
mv "$DEPOT$i" $SAVES_Y
}
for i in $(ls $DEPOT | egrep -i "$PATERN_Z")
{
mv "$DEPOT$i" $SAVES_Z
}
sleep $TEMPO
done;
Un bémol quand même, si tu pousse dans le dépot "A ranger" un fichier de x GiO et que le script tourne avant la fin de la copie, je ne sais pas ce qu'il se passe
Je reviendrais avec une autre version demain (ou pas) qui évite les 3 boucles (basée sur file -bi et les mimetype).
Au moins, je respecte le cahier des charges
Hors ligne
#3 Le 18/10/2009, à 22:03
- pasa88
Re : aide pour la creation d'un script
j'ai teste , oub , ça l'air plus compliqué que je croyais.
J'aime pas les signatures.....et alors?
Linux user #494088
http://www.aru2l.tuxfamily.org/
Hors ligne
#4 Le 18/10/2009, à 22:05
- pasa88
Re : aide pour la creation d'un script
faut pas finir le script avec exit 0?
J'aime pas les signatures.....et alors?
Linux user #494088
http://www.aru2l.tuxfamily.org/
Hors ligne
#5 Le 19/10/2009, à 10:52
- ChRiiS
Re : aide pour la creation d'un script
Le script est fonctionnel, je viens de le tester.
Je t'ai fait un petit pack qui va bien, tu peux le télécharger ici.
Une fois récupéré, tu extrais l'archive et tu te retrouves avec un dossier "exemple".
Lance le script "daemon" et quand tu jettes un fichier (.avi, .mp3, .ogg, .odt ou .odp) dans le dossier "depot" et il ira dans le dossier qui va bien dans "saves".
Hors ligne
#6 Le 19/10/2009, à 22:26
- pasa88
Re : aide pour la creation d'un script
Oh , t'est genial ...merci , super. Je croiais pas que ça va aller si vite
Grand merci !
J'aime pas les signatures.....et alors?
Linux user #494088
http://www.aru2l.tuxfamily.org/
Hors ligne
#7 Le 20/10/2009, à 10:26
- ChRiiS
Re : aide pour la creation d'un script
De rien
Par contre n'oublie pas ma remarque du post #2.
Essaye de faire des tests pour voir ce que ça donne
Hors ligne
#8 Le 20/10/2009, à 19:59
- pasa88
Re : aide pour la creation d'un script
Salut! , encore moi. J'essaye depuis tout a l'heure d'adapter le script a mes dossiers et mes fichiers: et ça donne quelque chose genre:
#!/bin/bash
TEMPO=15 # Temps d'attente entre 2 passes
DEPOT= /home/pasa/.aMule/incoming #Chemin vers le répertoire "A ranger"
SAVES= /home/pasa/.bordel #Chemin vers le répertoire rangé
SAVES_X="$SAVES /home/pasa/Filme" #Chemin vers Filme
SAVES_Y="$SAVES /home/pasa/Muzica" #Chemin vers Muzica
SAVES_Z="$SAVES /home/pasa/Documente" #Chemin vers Documente
PATERN_X=".(avi)" #Masque pour X
PATERN_Y=".(mp3|ogg)" #Masque pour Y
PATERN_Z=".(odt|odp)" #Masque pour Z
IFS='
'
while [ 1 ]
do
for i in $(ls $DEPOT | egrep -i "$PATERN_X")
{
mv "$DEPOT$i" $.bordel_Filme
}
for i in $(ls $DEPOT | egrep -i "$PATERN_Y")
{
mv "$DEPOT$i" $.bordel_Muzica
}
for i in $(ls $DEPOT | egrep -i "$PATERN_Z")
{
mv "$DEPOT$i" $.bordel_Documente
}
sleep $TEMPO
done;
A mes yeux non exerimentés , tout me semble a etre en regle .. mais son execution donné:
/home/pasa/.scripturi/script transfer fisiere.sh: line 5: /home/pasa/.aMule/incoming: No such file or directory
/home/pasa/.scripturi/script transfer fisiere.sh: line 6: /home/pasa/.bordel: este director
(*traduction pour la derniere ligne: "home/pasa/.scripturi/script transfer fisiere.sh: line 6: /home/pasa/.bordel: c'est un director").
et je suis certain que les dossiers mentionnées manquants: /amule/incoming , et /pasa/.bordel sont bien écrits. Donc je pense que je me suis gouré
J'aime pas les signatures.....et alors?
Linux user #494088
http://www.aru2l.tuxfamily.org/
Hors ligne
#9 Le 20/10/2009, à 21:14
- ChRiiS
Re : aide pour la creation d'un script
Re pasa38,
.aMule/incoming
Tu aurais du le dire tout de suite...
Bref, change daemon par :
#!/bin/bash
#USER=`whoiami` #Décommenter puis effacer le suivant si multi-utilisateurs et même arbo dans SAVES
USER="pasa"
TEMPO=15 # Temps d'attente entre 2 passes
DEPOT="/home/$USER/.aMule/incoming" #Chemin vers le répertoire "A ranger"
SAVES="/home/$USER" #Chemin vers le répertoire DÉFINITIF de l'ensemble des sauvegarde
SAVES_X="$SAVES/Filme" #Chemin vers le sous répertoire de SAVES Films
SAVES_Y="$SAVES/Muzica" #Chemin vers le sous répertoire de SAVES Musique
SAVES_Z="$SAVES/Documente" #Chemin vars le sous répertoire de SAVES Documents
PATERN_X=".(avi)" #Masque pour X
PATERN_Y=".(mp3|ogg)" #Masque pour Y
PATERN_Z=".(odt|odp)" #Masque pour Z
IFS='
'
while [ 1 ]
do
for i in $(ls $DEPOT | egrep -i "$PATERN_X")
{
mv "$DEPOT$i" $.bordel_Filme
}
for i in $(ls $DEPOT | egrep -i "$PATERN_Y")
{
mv "$DEPOT$i" $.bordel_Muzica
}
for i in $(ls $DEPOT | egrep -i "$PATERN_Z")
{
mv "$DEPOT$i" $.bordel_Documente
}
sleep $TEMPO
done;
PS : Oublie ma remarque dans #2, vu qu'on parle d'amule, les tmp vont dans un autre répertoire, dans ton cas donc quand le fichier arrive dans le répertoire "DEPOT" il est déjà complet
PS' : Ce script n'est pas une merveille en soit (3 loops, type de fichier par egrep (genre si tu télécharge "m.avi.mon.oeuvre.txt", il ira dans "/home/psa/Filme/" (mais "ma.vie.mon.oeuvre.txt" restera dans "DEPOT" (subtilité du ".avi"))) mais au moins, il fait le job
[edit]Je n'ai pas testé la nouvelle version du script, je testerais demain au taf' [/edit]
Dernière modification par ChRiiS (Le 20/10/2009, à 21:15)
Hors ligne
#10 Le 20/10/2009, à 21:26
- kyncani
Re : aide pour la creation d'un script
Si je puis me permettre, plutôt que
PATERN_Y=".(mp3|ogg)"
J'aurais mis
PATERN_Y='\.(mp3|ogg)$'
Raison :
- Le "." peut matcher n'importe quoi
- Le "$" s'assure qu'il s'agit bien d'une extension et non pas d'une partie du nom du fichier
EDIT: Par ailleurs, pour pouvoir gérer des arborescences, on aurait pû utiliser find plutôt que ls :
for i in $(ls $DEPOT | egrep -i "$PATERN_Y")
deviendrait
find "$DEPOT/" -type f | sed "s#^$DEPOT/##" | egrep -i "$PATTERN_Y" | while read i; do
d=`dirname "$SOMEWHERE/$i"`
test -e "$d" || mkdir $d
mv "$DEPOT/$i" "$SOMEWHERE/$i"
done
Dernière modification par kyncani (Le 20/10/2009, à 21:38)
Hors ligne
#11 Le 20/10/2009, à 21:30
- pasa88
Re : aide pour la creation d'un script
ouh desolé de t'avoir fait travaillé pour rien , si j'aurais su.....
mv: eșec la evaluarea stării (stat) fișierului `/home/pasa/.aMule/Incomingtupac shakur - 2pac greatest hits2 - brenda\'s got a baby.mp3': No such file or directory
Exécution du script...il en a plein des errors du ce type (pour chaque fichier existant) . En gros , si je comprend bien il peut pas déplacer les fichiers
*traduction: mv: échec a l'évaluation d'état du fichier .........
J'aime pas les signatures.....et alors?
Linux user #494088
http://www.aru2l.tuxfamily.org/
Hors ligne
#12 Le 20/10/2009, à 21:55
- pasa88
Re : aide pour la creation d'un script
ok , modification du script selon @kyncani:
se presente comme suit:
#!/bin/bash
#USER=`whoami` #Décommenter puis effacer le suivant si multi-utilisateurs et même arbo dans SAVES
USER="pasa"
TEMPO=15 # Temps d'attente entre 2 passes
DEPOT="/home/$USER/.aMule/Incoming" #Chemin vers le répertoire "A ranger"
SAVES="/home/$USER" #Chemin vers le répertoire DÉFINITIF de l'ensemble des sauvegarde
SAVES_X="$SAVES/Filme" #Chemin vers le sous répertoire de SAVES Films
SAVES_Y="$SAVES/Muzica" #Chemin vers le sous répertoire de SAVES Musique
SAVES_Z="$SAVES/Documente" #Chemin vars le sous répertoire de SAVES Documents
PATERN_X='\.(avi)$' #Masque pour X
PATERN_Y='\.(mp3|ogg)$' #Masque pour Y
PATERN_Z='\.(odt|odp)$' #Masque pour Z
IFS='
'
while [ 1 ]
do
find "$DEPOT/" -type f | sed "s#^$DEPOT/##" | egrep -i "$PATTERN_X" | while read i; do
{
mv "$DEPOT/$i" "$SOMEWHERE/$i"
done
}
find "$DEPOT/" -type f | sed "s#^$DEPOT/##" | egrep -i "$PATTERN_Y" | while read i; do
{
mv "$DEPOT/$i" "$SOMEWHERE/$i"
done
}
find "$DEPOT/" -type f | sed "s#^$DEPOT/##" | egrep -i "$PATTERN_Z" | while read i; do
{
mv "$DEPOT/$i" "$SOMEWHERE/$i"
}
sleep $TEMPO
done;
Lors de l'exécution (en terminal). Rien ne se passe , ouverture/fermeture éclair du terminal. Mes fichiers sont toujours dans Incoming.
Pff...j'ai du me gourer quelque part.
J'aime pas les signatures.....et alors?
Linux user #494088
http://www.aru2l.tuxfamily.org/
Hors ligne
#13 Le 20/10/2009, à 22:28
- kyncani
Re : aide pour la creation d'un script
Heu, le $SOMEWHERE, il fallait le remplacer par $SAVES_X, Y, Z
Bon, j'ai repris ton script l'ai amélioré en supprimant les trois boucles et en supportant des sous-répertoires dans incoming :
#! /usr/bin/env bash
########################################################################
## Program name
prog=`basename "$0"`
## Incoming directory
SRC="$HOME/tmp/Incoming"
## Destination directory
DST="$HOME/tmp"
## Mapping nom de fichier -> repertoire destination
CONF=` cat <<EOC
## Format : regexp directory
## Spaces not supported in directory specification
\\.(mp3|ogg)\$ $DST/Audio
\\.(avi|ogm|mkv)\$ $DST/Video
\\.(odt|odp)\$ $DST/Documents
EOC
`
## Wait some seconds before looking for new files
SCANDELAY=3600
## Verbose mode
VERBOSE=false
########################################################################
CONF2=`
echo "$CONF" \
| sed 's/^[[:space:]]*//' \
| grep -v '^$' \
| grep -v '^#' \
`
if test "$CONF2" = ""; then
echo "$prog: Nothing to do" >&2
exit
fi
while true; do
if ! test -d "$SRC/"; then
echo "$prog: Not a directory: $SRC" >&2
exit 1
fi
find "$SRC/" -type f | while read src; do
echo "$CONF2" | while read pattern dstroot; do
echo "$src" | egrep -qi "$pattern" || continue
f=`echo "$src" | sed "s#^$SRC/##"`
dst="$dstroot/$f"
d=`dirname "$dst"`
if test -e "$dst"; then
echo "$prog: Cannot move $src to $dst : File already exists" >&2
exit 1
fi
if ! test -e "$d"; then
$VERBOSE && echo "$prog: `date`: Creating directory $d"
if ! mkdir -p "$d"; then
echo "$prog: Cannot create directory $d" >&2
exit 1
fi
fi
$VERBOSE && echo "$prog: `date`: Moving $src to $dst"
if ! mv "$src" "$dst"; then
echo "$prog: Cannot move $src to $dst" >&2
exit 1
fi
break
done
done
sleep "$SCANDELAY"
done
########################################################################
Il faut changer les noms des répertoires de ceux que j'avais utilisés pour vérifier que ça fonctionne.
Hors ligne