我正在开发一个备份脚本(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 0Run Code Online (Sandbox Code Playgroud)
虽然您可以使用循环来完成此操作,但stat如果您真的想要,这是find非常擅长的并且可以在一行中完成。您可以在每次脚本运行时创建一个特殊的时间戳文件,然后使用以下命令选择比该文件新/旧的所有文件:
find -name "*.$filetype" ! -newer timestamp.file
Run Code Online (Sandbox Code Playgroud)
这将在目录树中找到根据 pattern 命名的所有文件,这些文件比您要求的时间戳文件*.$filetype旧(不是!新)。如果您想要更新的文件(这似乎更有用),只需取出!.
找到文件后,您可以find使用 `-exec要求对它们做一些事情:
find -name "*.$filetype" -newer timestamp.file -exec cp '{}' "$destination" +
Run Code Online (Sandbox Code Playgroud)
这将以cp所有匹配的文件作为参数运行,放入名为 的目录中$destination,将所有匹配的文件复制到该目录中。
在每次脚本运行结束时,您可以使用以下命令更新比较文件上的时间戳touch:
touch timestamp.file
Run Code Online (Sandbox Code Playgroud)
这就是下次要使用的比较点。如果在脚本运行时文件可能被修改,您需要更加小心 - 在开始时更新时间戳文件,但首先使用 复制带有其属性的旧文件cp -p,并将其用于比较(或相反亦然)。
为了与当前时间进行比较(如标题中所示),-mtime测试 tofind可能很有用,但我认为从文本中您真正想要的是获取脚本两次执行之间的更改。
脚本中的焦油、用户交互等可以保持不变。如果您只需要当前目录(而不是子目录)中的文件,请添加-maxdepth 1.