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 …
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
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)
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
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 [/quote]
Bien vu. C’est vrai que c’est 1000 fois plus simple. Mais bon je me suis bien amusé à faire ce script :smt003
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?
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.
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
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)
[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.
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]
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!