web-dev-qa-db-fra.com

Shell Script - Récupère tous les fichiers modifiés après le <date>

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.

131
Peter

aussi simple que:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

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
132
skrat

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)
  • Plus des alternatives pour le temps d'accès et le temps de "changement" ou de "création".

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.

90
Jonathan Leffler

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.

31
linux_newbie

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.

17
Jason Luther

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.

12
Chris Doggett

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"

3
Michel

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

3
Luixv

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.

3
mouviciel

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.

2
Zeeshan Ali