我正在开发一个备份脚本(bash shell - Fedora - VMware),该脚本应该将文件与上次修改的属性和当前日期进行比较,并且如果上次修改的日期早于脚本的上次运行日期,则应该备份它。
我已经尝试了一些东西(awk、stat 和 grep),但是我无法做出一些可以进行比较并让脚本决定是否应该备份文件的东西。
请重点关注2个案例陈述。
#! /bin/sh
echo "welcome to backup pro"
echo -e "\n 1:Full \n 2:Incremental"
echo "Enter your choice"
read choice
echo "Enter the files to be backup"
read filetype
echo "Enter the destination folder"
read destination
case $choice in
1)
echo "The selected backup type is Full backup"
echo "Backing up $filetype files.."
sleep 1
cp *.$filetype /home/uone/backup_folder
tar -zcvf archive_backup_folder.tar.gz backup_folder/ 2>full-error.log
mv archive_backup_folder.tar.gz /home/uone/backup_folder; cd /home/uone/backup_folder ; rm *.$filetype
sleep 1
tail full-error.log
break
;;
2)
echo "The backup you chose is Increment"
ls -l | awk 'END {print $9 "\t" $8}'
b=data "%H%M%S"
if [ $a -lt $b ];
then
echo "This is under construction"
fi
;;
esac
exit 0
答案1
虽然你可以用循环来做到这一点,stat
如果你真的想要的话,这是这样的find
擅长并且可以在一条线上完成。您可以在每次运行脚本时创建一个特殊的时间戳文件,然后使用以下命令选择比该文件新/旧的所有文件:
find -name "*.$filetype" ! -newer timestamp.file
这将找到目录树中根据模式命名的所有文件*.$filetype
,并且!
按照您的要求,这些文件比时间戳文件更旧(而不是新)。如果您想要更新的文件(这似乎更有用),只需取出!
.
找到这些文件后,您可以find
使用“-exec”要求对它们执行某些操作:
find -name "*.$filetype" -newer timestamp.file -exec cp '{}' "$destination" +
它将cp
以所有匹配的文件作为参数运行,并将其放入名为 的目录中$destination
,并将所有匹配的文件复制到该目录中。
在每次运行脚本结束时,您可以使用以下命令更新比较文件上的时间戳touch
:
touch timestamp.file
这就是下次要使用的比较点。如果在脚本运行时文件可能被修改,您需要更加小心 - 在开始时更新时间戳文件,但首先使用复制旧文件及其属性cp -p
,并将其用于比较(反之亦然)。
为了与当前时间(如标题中所示)进行比较,-mtime
测试 可能find
很有用,但我认为从文本中您真正想要的是获取脚本两次执行之间的更改。
脚本中的压缩、用户交互等可以保持不变。如果您只需要当前目录(而不是子目录)中的文件,请添加-maxdepth 1
.