Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 wink

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 wink

Par contre n'oublie pas ma remarque du post #2.
Essaye de faire des tests pour voir ce que ça donne smile

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,

pasa88 a écrit :

.aMule/incoming

Tu aurais du le dire tout de suite... roll
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;

tongue

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 wink

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 tongue

[edit]Je n'ai pas testé la nouvelle version du script, je testerais demain au taf' wink[/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 wink

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