Remplacez votre find
commande avec ceci et réessayez,
find /var/log -type f -mtime +7
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'étendra pour fournir tar
avec un argument par nom de fichier et fonctionnera même si les noms de fichiers contiennent des espaces, des tabulations ou des retours à la ligne. En revanche, après que le shell se développe ${files[*]}
, il effectuera une division des mots, ce qui pourrait altérer vos noms de fichiers.
Pour une explication détaillée de la boucle utilisée pour créer le files
tableau, voir :Comment puis-je stocker le résultat de la commande find sous forme de tableaux dans Bash ?
Tous les fichiers et répertoires produits par la commande find /var/log/ -mtime +7
sera inclus dans le tar
dossier. Pour inclure uniquement des fichiers, pas des répertoires, consultez la réponse de Skynet.
Pour archiver les journaux des sept derniers jours
Un seul caractère à modifier :
#!/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 supérieur à n,
-n pour moins de 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 parties fractionnaires. Donc +7
inclura 8 jours mais pas 7,5 jours. Voir man find
pour plus de détails.