Je préférerais ne pas le faire dans PHP et j'espère donc que quelqu'un de décent chez Shell pourra vous aider.
J'ai besoin d'un script qui parcourt le répertoire de manière récursive et trouve tous les fichiers dont la date de dernière modification est supérieure à une date donnée. Ensuite, il va tar et compresser le (s) fichier (s) en conservant les informations de chemin.
aussi simple que:
find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz
où find . -mtime -1
sélectionnera tous les fichiers du répertoire actuel (récursivement) modifié la veille. vous pouvez utiliser des fractions, par exemple:
find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz
Si vous avez GNU find
, il existe une légion d'options pertinentes. Le seul problème est que leur interface est moins que stellaire:
-mmin n
(temps de modification en minutes)-mtime n
(heure de modification en jours)-newer file
(heure de modification plus récente que l'heure de modification du fichier)-daystart
(ajuste l'heure de début de l'heure au début de la journée)La partie difficile est de déterminer le nombre de minutes depuis une heure.
Une option à considérer: utilisez touch
pour créer un fichier avec l’horodatage de modification requis; puis utilisez find
avec -newer
.
touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit
Cela recherche les fichiers plus récents que 2009-01-03T12: 31: 43. Clairement, dans un script, /tmp/wotsit
serait un nom avec le PID ou une autre valeur pour le rendre unique; et il y aurait un trap
pour s'assurer qu'il est supprimé même si l'utilisateur interrompt, etc., etc.
Vous pouvez le faire directement avec tar et même mieux:
tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files
Ceci indique à tar de compresser les fichiers plus récents que le 1er janvier 2014 à 18:00:00.
Cela fonctionnera pour un certain nombre de fichiers. Vous souhaitez inclure "-print0" et "xargs -0" au cas où l'un des chemins contient des espaces. Cet exemple recherche les fichiers modifiés au cours des 7 derniers jours. Pour trouver ceux modifiés avant les 7 derniers jours, utilisez "+7".
find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2
Comme cette page avertit, xargs peut provoquer l'exécution de la commande tar plusieurs fois s'il y a beaucoup d'arguments, et l'indicateur "-c" peut être à l'origine de problèmes. Dans ce cas, vous voudriez ceci:
find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar
Vous ne pouvez pas mettre à jour une archive tar compressée avec tar, vous devez donc bzip2 ou gzip dans un deuxième temps.
Cela devrait afficher tous les fichiers modifiés au cours des 7 derniers jours.
find . -type f -mtime -7 -print
Pipe ça dans goudron/zip, et tu devrais être bon.
Je voudrais simplement faire ce qui suit pour sauvegarder tous les nouveaux fichiers d'il y a 7 jours
tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .
notez que vous pouvez également remplacer "il y a 7 jours" par tout ce qui vous convient
Peut être: date -d'yesterday' +"%d-%b"
Ou même: date -d'first Sunday last month' +"%d-%b"
bien sous linux essayez de lire la page de manuel de la commande find
man find
quelque chose comme ça devrait
find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9
et vous l'avez
Vous pouvez obtenir une liste des derniers fichiers modifiés il y a plus de x jours avec:
find . -mtime -x
Il ne reste plus qu’à tar et aux fichiers Zip dans la liste des résultats, par exemple:
tar czvf mytarfile.tgz `find . -mtime -30`
pour tous les fichiers modifiés au cours du mois dernier.
Ce script trouvera les fichiers ayant une date de modification de deux minutes avant et après la date donnée (et vous pourrez modifier les valeurs dans les conditions selon vos besoins).
PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"
cd $PATH_SRC
TODAY=$(date -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)
for f in `ls`;
do
# echo "File -> $f"
MOD_DATE=$(stat -c %y "$f")
MOD_DATE=${MOD_DATE% *}
# echo MOD_DATE: $MOD_DATE
MOD_DATE1=$(date -d "$MOD_DATE" +%s)
# echo MOD_DATE: $MOD_DATE
DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE
#mv $PATH_SRC/$f $PATH_DST/$f
fi
done
Par exemple, si vous souhaitez que les fichiers dont la date de modification est antérieure à la date donnée soient modifiés, vous pouvez modifier 120
en 0
dans le paramètre $DIFF_IN_DATE
en ignorant les conditions du paramètre $DIFF_IN_DATE1
.
De même, si vous voulez que les fichiers aient une date de modification 1 heure avant et après la date indiquée, remplacez simplement 120
par 3600
dans if CONDITION
.