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:
#!/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[@]}"
Note the use of "${files[@]}"
as opposed to ${files[*]}
. "${files[@]}"
will expand to provide tar
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 Bash
All files and directories produced by the command find /var/log/ -mtime +7
will be included in the tar
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:
#!/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[@]}"
This works because find
interprets numeric arguments as follows:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
Thus, -mtime +7
means greater than 7 days old while -mtime -7
means less than 7. Note that find
will ignore fractional parts. Thus +7
will include 8 days old but not 7.5 days old. See man find
for details.
Replace your find
command with this and try again,
find /var/log -type f -mtime +7