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
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.
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.
Remplacez votre commande find
par ceci et essayez à nouveau,
find /var/log -type f -mtime +7