web-dev-qa-db-fra.com

Comment créer un fichier tar pour les fichiers de plus de 7 jours à l'aide du script shell Linux

J'écris un script shell pour sauvegarder des fichiers de plus de 7 jours. Voici mon code. Mais je n'obtiens pas le résultat escompté. Quelqu'un peut-il me corriger?

#!/bin/bash
# Backup files

files=($(find /var/log/ -mtime +"7"))
 for files in ${files[*]}
 do
         echo $files
         tar cvfz backup.tar.gz $files
 done
8
Palanikumar

Cela fonctionnera:

#!/bin/bash
files=()
while IFS=  read -r -d $'\0'; do
    files+=("$REPLY")
done < <(find /var/log/ -mtime +7 -print0)
tar cvfz backup.tar.gz "${files[@]}"

Notez l'utilisation de "${files[@]}" par opposition à ${files[*]}. "${files[@]}" s'agrandira pour fournir à tar un argument par nom de fichier et fonctionnera même si les noms de fichiers contiennent des espaces, des tabulations ou des nouvelles lignes. En revanche, une fois que le shell a développé ${files[*]}, il procédera au fractionnement de Word, éventuellement en modifiant vos noms de fichiers.

Pour une explication détaillée de la boucle utilisée pour créer le tableau files, voir: Comment puis-je stocker le résultat de la commande find en tant que tableaux dans Bash

Tous les fichiers et répertoires générés par la commande find /var/log/ -mtime +7 seront inclus dans le fichier tar. Pour inclure uniquement les fichiers, pas les répertoires, voir la réponse de Skynet.

Pour archiver les journaux des sept derniers jours

Un seul caractère doit être changé:

#!/bin/bash
files=()
while IFS=  read -r -d $'\0'; do
    files+=("$REPLY")
done < <(find /var/log/ -mtime -7 -print0)
tar cvfz backup.tar.gz "${files[@]}"

Cela fonctionne car find interprète les arguments numériques comme suit:

Les arguments numériques peuvent être spécifiés comme
+ n pour plus que n,
-n pour moins que n,
n pour exactement n.

Ainsi, -mtime +7 signifie plus de 7 jours alors que -mtime -7 signifie moins de 7. Notez que find ignorera les fractions. Ainsi, +7 inclura 8 jours mais pas 7,5 jours. Voir man find pour plus de détails.

14
John1024

Remplacez votre commande find par ceci et essayez à nouveau,

find /var/log -type f -mtime +7 
3
Skynet