Script shell et vérification repertoire/date

Bonjour,

comment créer une condition qui compare la date de modification d’un répertoire et qui si la date est égal a la date du jour, le zip.

je sais faire cela avec deux fichiers :

if [ f1 -nt f2] then zip -j fi.zip else echo "le fichier $f2 est plus récent" fi
Ce qui serait l’idéal ce serait de pouvoir vérifier les fichiers d’un dossier et si des fichiers ont été modifié de pouvoir les copier dans un repertoire tmp puis de les ziper mais bon …

Avez vous une idée?
Merci

tu peux utiliser le bit d’archivage pour faire cela.

Si tu veux bien préciser car je ne saisie pas ton information, ce serait chouette.
Merci

Un trucs du genre:

#! /bin/bash

#Variable
FILE=`find $1 -type f`
DATE=`date +%Y-%m-%d\ %H:%m`

for f in $FILE
do
i=`ls -al $f | awk '{ print $6 " " $7}'`
        if [[ `echo "$i"` != `echo "$DATE"` ]]
                then `bzip2 -9 $f`
        fi
done

$1 est l’argument avec le path du folder à traiter.

Merci Ludo. Que veux tu dire par [quote]$1 est l’argument avec le path du folder à traiter.[/quote]?

Pour lancer le script tu doit faire:

./le_script /mon/path/vers/le/rep

Et $1 est égale à /mon/path/vers/le/rep

Petite précision, pour le paramètre date j’ai mit l’heure dans la comparaison. Si tu veut l’enlever tu modifie les variables suivantes:

DATE=`date +%Y-%m-%d\ %H:%m` i=`ls -al $f | awk '{ print $6 $7 " " $8 }'`

Par ceci:

DATE=`date +%Y-%m-%d` i=`ls -al $f | awk '{ print $6}'`


Edit
Il y avais une faute dans le script de base.

Remplace ceci: i=ls -al $f | awk '{ print $6 $7 " " $8 }' par ceci: i=ls -al $f | awk '{ print $6 " " $7}'

Merci pour toutes ces précisions mais une petite chose si je suis obligé de lancer le script en lui passant comme argument le chemin vers le répertoire comment faire si je veux lancer le script en automatique par exemple avec Crontab ou autre car justement c’est pour automatiser les tâches que je me lance dans la création de scripts shell.

Pour ce qui est de

j"avais déjà modifié en

"i=`ls -al $f | awk '{ print $6 " " $7 " " $8}'`"

car je souhaite l’heure egalement.

De plus quand je lance le script avec :

j’ai les messages suivants :

ls: ne peut accéder de: Aucun fichier ou répertoire de ce type
ls: ne peut accéder Frais: Aucun fichier ou répertoire de ce type
ls: ne peut accéder .xls: Aucun fichier ou répertoire de ce type

Merci

Ben dans ton fichier de déclaration du cron (crontab ou autres) tu passe simplement l’argument avec.

Genre:

Si tu veux faire cela pour des répertoire que ne sont pas dans le même arborescence.

Par exemple pour le répertoire /home/toto/les_doc_de_toto et /home/titi/les_docs_de_titi il faudras que tu déclare 2 lignes cron. Où alors agrémenter le script, avec des arguments supplémentaires.

0 00 * * 1-5 toto /path/script.sh /home/toto/les_doc_de_toto 0 00 * * 1-5 titi /path/script.sh /home/titi/les_docs_de_titi

Vérifie aussi si tu le fait pour d’autre utilisateur que le script se lance via l’utilisateur et qu’il à le droit de le lancer. Car sinon les fichiers risque de devenir la propriété de root. (voir première ligne de cron)

Salut,

Je n’ai pas tout lu des solutions proposées mais il me semble qu’il suffit de créer un fichier en début de script, il aura donc la date du jour et comme tu sais faire le reste :slightly_smiling:

[quote=“ggoodluck47”]Salut,

Je n’ai pas tout lu des solutions proposées mais il me semble qu’il suffit de créer un fichier en début de script, il aura donc la date du jour et comme tu sais faire le reste :slightly_smiling:[/quote]

Bien vu. C’est vrai que c’est 1000 fois plus simple. Mais bon je me suis bien amusé à faire ce script :smt003

Que voulez vous dire par

Bon j’ai testé je script mais apparemment la date n’est pas prise en compte puisque le script me zip tous les fichiers .

J’ai remarqué que le formatage de la variable DATE donne

DATE=`date +%Y-%m-%d\ %H:%m` echo $DATE 2008-07-29 16:07 alors que le formatage qui ressort suite a la commande ci-dessous est :

ls -lrt $f | awk '{ print $6 " " $7 " " $8 }' jun 11 10:15 jun 20 09:40 jun 23 08:10 jui 7 18:18 jui 21 12:28 jui 22 10:25 jui 24 13:39

Pour que la date des fichiers soit prise en compte, il faut apporté une modification au script d’origine.

[code]#! /bin/bash

#Variable
FILE=find $1 -type f
DATE=date +%b-%d

for f in $FILE
do
i=ls -lrt $f | awk '{ print $6"-"$7 }'
if [[ echo "$i" = echo "$DATE" ]]
then bzip2 -9 $f
fi
done
[/code]

Merci

Autre chose le script suivant

[code]#! /bin/bash

#Variable
FILE=find $1 -type f
DATE=date +%b-%d

for f in $FILE
do
i=ls -lrt $f | awk '{ print $6"-"$7 }'
if [[ echo "$i" = echo "$DATE" ]]
then bzip2 -9 $f
fi
done [/code]

me zip les fichiers dans le répertoire passé en argument hors ce n’est pas très pratique. Comment faire pour que le script me zip les fichiers du répertoire passé en argument mais qu’il les place dans un autre répertoire?

Merci

Ha oui le script est basé sur mon PC donc sur mes locales.

Chez moi la date sortie avec awk et date est du même format. Donc le mieux serait d’utiliser la méthode de ggoodluck47, qui est la création d’un fichier en début de script. Cela permet d’avoir un script beaucoup plus portable.

[quote=“pcsystemd”]Autre chose le script suivant

[code]#! /bin/bash

#Variable
FILE=find $1 -type f
DATE=date +%b-%d

for f in $FILE
do
i=ls -lrt $f | awk '{ print $6"-"$7 }'
if [[ echo "$i" = echo "$DATE" ]]
then bzip2 -9 $f
fi
done [/code]

me zip les fichiers dans le répertoire passé en argument hors ce n’est pas très pratique. Comment faire pour que le script me zip les fichiers du répertoire passé en argument mais qu’il les place dans un autre répertoire?

Merci[/quote]

Ben tu ajoute un move par exemple.

[code]#! /bin/bash

#Variable
FILE=find $1 -type f
DATE=date +%b-%d

for f in $FILE
do
i=ls -lrt $f | awk '{ print $6"-"$7 }'
if [[ echo "$i" = echo "$DATE" ]]
then bzip2 -9 $f && mv *.bz2 /mon/repertoire
fi
done [/code]

Avec création d’un fichier plutôt que utiliser le format de la commande date.

[code]#! /bin/bash

Variable

touch compare
FILE=find $1 -type f
DATE=ls -la compare | awk '{print $6 " " $7}'

Process

for f in $FILE
do
i=ls -al $f | awk '{ print $6 " " $7 }'
if [[ echo "$i" != echo "$DATE" ]]
then bzip2 -9 $f && mv $1/*.bz2 /tmp
fi
done
rm -rf compare
[/code]

Edit: Petite correction au niveau du mv, mettre l’argument sans le / à la fin du path ( /mon/rep )

En une ligne:

Explication:

find . recherche à partir du répertoire courant -type f uniquement les fichiers -maxdepth 1 ne pas parcourir les sous-répertoires (optionnel) -cmin -n filtre uniquement les fichiers modifiés depuis moins de n minutes $(($(date +%k) * 60)) nombre de minutes depuis le début de la journée -exec commande-zip '{}' sur chaque fichier trouvé, exécuter commande-zip

A adapter à tes besoins (paramètres positionnel $1, commande zip etc…)

Voici mon petit rapport suite a tes indications a mes tests.

le script ci-dessous avec la création du fichier ne fonctionne pas il ne me zippe aucun fichiers et ne me les deplace pas . De plus je pensais a un truc étant donné que je souhaite zipper les fichiers ayant la date du jour (if [[ echo "$i" = echo "$DATE" ]]), le fichier crée par la commande touch tmpfile sera également zipper et donc la commanderm -rf tmpfilene fonctionnera pas.

#! /bin/bash

TMPDIR="$HOME/tmp"
touch tmpfile
FILE=`find $1 -type f`
DATE=`ls -lrt tmpfile | awk '{print $6 " " $7}'`

for f in $FILE
do
i=`ls -lrt $f | awk '{ print $6"-"$7 }'`
        if [[ `echo "$i"` = `echo "$DATE"` ]]
                then `bzip2 -9 $f && mv $1 *.bz2 $TMPDIR`
fi
done
rm -rf tmpfile

Pour ce qui est du script ci_dessous sans la création du fichier, cela fonctionne mais j’ai un détail qui est très gênant c’est que le script me zippe les fichiers originaux dans le répertoire courant au lieu de me faire un backup de ces fichiers dans un autre répertoire puis de les zipper et c’est gênant car les fichiers originaux sont utilisés régulièrement et il faut a chaque lancement du script retourner dans les repertoires courants et dezipper les fichiers ce qui est impossible.

#! /bin/bash

TMPDIR="$HOME/tmp"
FILE=`find $1 -type f`
DATE=`date +%b-%d`

for f in $FILE
do
i=`ls -lrt $f | awk '{ print $6"-"$7 }'`
        if [[ `echo "$i"` = `echo "$DATE"` ]]
                then `bzip2 -9 $f && mv $1 *.bz2 $TMPDIR`
fi
done

Avez vous une idée?

Merci encore a tous.

Merci Ripat.

Pour ce qui est de ta ligne de commande, elle me zippe tous les fichiers sans tenir compte de la date et j’ai également le message suivant qui s’affiche

Le message :

find: AVERTISSEMENT: vous avez spécifié l'option -maxdepth après un argument qui n'est pas une option -type mais les options sont positionnelles (-maxdepth affecte les tests spécifiés avant aussi bien qu'après)

Une idée?

Re,

Tu remplaces le mv par cp et tu places le bzip2 après le cp sur la copie :slightly_smiling:

Allez, un effort, tu as fait le plus gros :smt006

Joue avec la valeur de -cmin et remplace ta commande zip par un ls -l pour vérifier ce que find trouve.

-exec peut contenir plusieurs commandes.

Le reste est un avertissement, pas une erreur. Je dois m’absenter pour deux jours, d’autres pour poursuivre et peaufiner les détails?

:smt006

[quote=“pcsystemd”]Voici mon petit rapport suite a tes indications a mes tests.

le script ci-dessous avec la création du fichier ne fonctionne pas il ne me zippe aucun fichiers et ne me les deplace pas . De plus je pensais a un truc étant donné que je souhaite zipper les fichiers ayant la date du jour (if [[ echo "$i" = echo "$DATE" ]]), le fichier crée par la commande touch tmpfile sera également zipper et donc la commanderm -rf tmpfilene fonctionnera pas.
[/quote]

Sauf si tu n’execute pas le script dans le répertoire que tu traite.

Normale tu fait une faute c’est: bzip2 -9 $f && mv $1/*.bz2 $TMPDIR

[quote=“pcsystemd”]
Pour ce qui est du script ci_dessous sans la création du fichier, cela fonctionne mais j’ai un détail qui est très gênant c’est que le script me zippe les fichiers originaux dans le répertoire courant au lieu de me faire un backup de ces fichiers dans un autre répertoire puis de les zipper et c’est gênant car les fichiers originaux sont utilisés régulièrement et il faut a chaque lancement du script retourner dans les repertoires courants et dezipper les fichiers ce qui est impossible.

#! /bin/bash

TMPDIR="$HOME/tmp"
FILE=`find $1 -type f`
DATE=`date +%b-%d`

for f in $FILE
do
i=`ls -lrt $f | awk '{ print $6"-"$7 }'`
        if [[ `echo "$i"` = `echo "$DATE"` ]]
                then `bzip2 -9 $f && mv $1 *.bz2 $TMPDIR`
fi
done

Avez vous une idée?

Merci encore a tous.[/quote]

Ben tu fait un cp vers ton répertoire de backup avant de zipper.

Donc:

[code]#! /bin/bash

Script qui compare la date du fichier trouver dans un répertoire ($1) qui si elle n’est pas égale à la date d’aujourd’hui, compresse le fichier.

création du fichier

touch compare

Variable

FILE=find $1 -type f
DATE=ls -la compare | awk '{print $6 " " $7}'

Processus de comparaison de date

for f in $FILE
do
#variable date du fichier
i=ls -al $f | awk '{ print $6 " " $7 }'
if [[ echo "$i" != echo "$DATE" ]]
#copie le fichier ou l’écrase sans demander confirmation
then \cp -p $f /mon/repertoire/backup
fi
done
#Zip tous les fichier dont l’extension n’est pas bz2 dans le répertoire
for b in $(ls /mon/repertoire/backup | grep [^bz2]$); do bzip2 -9 $b;done
rm -rf compare
[/code]

Merci a tous encore. Bon Ludo j’ai testé :

[code]#! /bin/bash

Script qui compare la date du fichier trouver dans un répertoire ($1) qui si elle n’est pas égale à la date d’aujourd’hui, compresse le fichier.

création du fichier

touch tmpfile

Variable

TMPDIR="$HOME/tmp"
FILE=find $1 -type f
DATE=ls -la tmpfile | awk '{print $6 " " $7}'

Processus de comparaison de date

for f in $FILE
do
#variable date du fichier
i=ls -al $f | awk '{ print $6 " " $7 }'
if [[ echo "$i" = echo "$DATE" ]]
#copie le fichier ou l’écrase sans demander confirmation
then \cp -p $f $TMPDIR
fi
done
#Zip tous les fichier dont l’extension n’est pas bz2 dans le répertoire
for b in $(ls $TMPDIR | grep [^bz2]$); do bzip2 -9 $b;done
rm -rf tpmfile
[/code]

Alors il fonctionne sauf qu’il me copie les fichiers originaux dans mon répertoire backup et il ne les compresse pas par contre il les compresse dans le répertoire courant hors cela devrait être le contraire non!

Encore merci