I'm writing shell script to backup files older than 7 days. Here is my code. But i'm not getting expected result. Can anyone correct me?
#!/bin/bash
# Backup files
files=($(find /var/log/ -mtime +"7"))
for files in ${files[*]}
do
echo $files
tar cvfz backup.tar.gz $files
done
This will work:
Note the use of
"${files[@]}"
as opposed to${files[*]}
."${files[@]}"
will expand to providetar
with one argument per file name and will work even if the file names contain spaces, tabs, or newlines. By contrast, after the shell expands${files[*]}
, it will perform word splitting, potentially mangling your file names.For a detailed explanation of the loop used to create the
files
array, see: How can I store find command result as arrays in BashAll files and directories produced by the command
find /var/log/ -mtime +7
will be included in thetar
file. To include only files, not directories, see Skynet's answer.To archive logs from the seven most recent days
Only one character need change:
This works because
find
interprets numeric arguments as follows:Thus,
-mtime +7
means greater than 7 days old while-mtime -7
means less than 7. Note thatfind
will ignore fractional parts. Thus+7
will include 8 days old but not 7.5 days old. Seeman find
for details.Replace your
find
command with this and try again,