《Advanced Bash-scripting Guide》学习(九):备份最后一天所有修改的文件
本文所选的例子来自于《Advanced Bash-scripting Gudie》一书,译者 杨春敏 黄毅
Example 3-4. 备份最后一天所有修改的文件
#!/bin/bash #备份最后24小时当前目录下所有修改的文件 BACKUPFILE=backup-$(date +%m-%d-%Y) #在备份文件中嵌入时间 archive=${1:-$BACKUPFILE} #如果在命令行中没有指定备份文件的文件名,那么将默认使用"backup-MM-DD-YYYY.tar.gz" tar -cvf - `find . -mtime -1 -type f -print` > $archive.tar find . -mtime -1 -type f print0 | xargs -0 tar -rvf "$archive.tar" gzip $archive.tar echo "Directory $PWD backed up in archive file '$archive.tar.gz'" #如果在文件太多或者文件名包含空格的时候,将执行失败,因此追加一行代码(上文下划线标识) exit 0
对于这个脚本,要注意以下几点:
1.archive=${1:-$BACKUPFILE}
$1是传给脚本的第一个参数,这句是说,如果$1在脚本中未定义,则将变量BACKUPFILE的值赋给变量archive
举例:
#unset a #确保a未定义
#echo ${a:-456} #如果a未定义,将456作为默认值
456
#echo $a #此时a值仍未定义
#echo ${a:=789} #如果a未定义,将789作为默认值,并将a的值设置为789
789
#echo $a #此时a的值为789
789
2.find 文件搜索命令
-mtime -1:最后一次文件内容修改发生在一天之内
-type:根据文件类型查找
f 文件 d 目录 l 软连接文件
-print:表示将结果输出到标准输出上
3.xargs是命令传递参数的一个过滤器。从管道或stdin中读取数据,也可以从文件输出中读取数据。其默认命令是echo,意味着从管道传递给xargs的输入将包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。
find每输出一个文件名,后面都会接着输出一个换行符'n'。对于有空格的文件名如"abc 123",利用find . -name 'abc*' | xargs rm 无法删除。
原因:xargs默认是以空白字符(空格,tab,换行符)来分割记录的,因此文件名"abc 123"被解释成两个记录"abc","123",rm找不到这两个文件。
解决办法:让find在打印出一个文件名之后接着输出一个NULL字符 ('') 而不是换行符,然后再告诉 xargs 也用NULL字符来作为记录的分隔符。这就是find的 -print0和 xargs -0的来历吧。
4.tar -f 向已经存在的归档文件中追加文件
脚本运行结果
虽然也能得到正确的结果,但是脚本执行过程中会有报错,并且find命令执行两次,第二次才能找到带有空格的文件名。
不妨稍加改动
#!/bin/bash #备份最后24小时当前目录下所有修改的文件 BACKUPFILE=backup-$(date +%m-%d-%Y) archive=${1:-$BACKUPFILE} find . -mtime -1 -type f print0 | xargs -0 tar -cvf "$archive.tar" gzip $archive.tar echo "Directory $PWD backed up in archive file '$archive.tar.gz'" exit 0
改动后的脚本运行结果
《Advanced Bash-scripting Guide》学习(九):备份最后一天所有修改的文件的更多相关文章
- C0304 备份最后一天所有修改的文件
#! /bin/bash backupfile=backup-$(date +%m-%d-%Y) archive=${1:-$backupfile} # 上边内容, 参数替换 ${} echo $ar ...
- advanced bash shell guide读书笔记
http://note.youdao.com/noteshare?id=fc23a679849b4627d131d3ef07c74a71
- advanced dom scripting dynamic web design techniques Part One DOM SCRIPTING IN DETAIL CHAPTER 1 DO IT RIGHT WITH BEST PRACTICES
You’re excited; your client is excited. All is well. You’ve just launched the client’s latest websit ...
- [terry笔记]RMAN综合学习之备份
rman是最经济实惠的oracle备份工具,在这里做一个rman的整体学习. 文章中大多是rman命令的语法,还是最好做做实验,以便印象深刻,因为大多数数据库的备份就是按时跑脚本,恢复也不是经常能遇到 ...
- RMAN综合学习之备份
rman是最经济实惠的oracle备份工具,在这里做一个rman的整体学习. 文章中大多是rman命令的语法,还是最好做做实验,以便印象深刻,因为大多数数据库的备份就是按时跑脚本,恢复也不是经常能遇到 ...
- 《DOM Scripting》学习笔记-——第三章 DOM
<Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...
- 《DOM Scripting》学习笔记-——第二章 js语法
<Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...
- Shell 实例:备份最后一天内所有修改过的文件
在一个"tarball"中(经过 tar 和 gzip 处理过的文件)备份最后 24 小时之内当前目录下所有修改的文件. 程序代码如下: #!/bin/bash BACKUPFIL ...
- [转帖][Bash Shell] Shell学习笔记
[Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html 阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...
随机推荐
- python面试题(三)
1 一行代码实现9*9乘法表 print ("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y ...
- 使用 adb logcat 显示 Android 日志
本文为转载. 地址:http://www.hanshuliang.com/?post=32 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. ...
- Android系统移植与调试之------->build.prop文件详细赏析
小知识:什么是build.prop? /system/build.prop 是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似於/etc中的文件.这个文件是如 ...
- Linux vim编写程序时出现高亮字符,如何取消?
在“命令模式”下输入“:nohl“,再按回车,便可以取消高亮显示.
- 【AWS】订阅AWS论坛的RSS消息获取最新公告
背景:AWS在遇到系统升级.系统故障等问题的时候,会在其官方论坛发布通知,并同步到RSS 前言:我们在项目中遇到几次AWS的RDS出现故障导致系统受影响,当系统故障时,我们的监控系统会发送一堆告警出来 ...
- PAT 天梯赛 L1-030. 一帮一 【STL】
题目链接 https://www.patest.cn/contests/gplt/L1-030 思路 用三个 Vector 来分别存放 整个排名,以及男生的单独排名和女生的单独排名 从整个的排名 从上 ...
- iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期
1. 属性 在开发过程中经常要用到定义属性,@property和@synthesize是经常用到的属性, property在.h文件中作声明,@synthesize在.m文件中用于实现 // Stud ...
- event driven model
http://www.jdon.com/eda.html http://blog.csdn.net/gykimo/article/details/9182287 事件代表过去发生的事件,事件既是技术架 ...
- STM32系列第15篇--灵活的静态存储控制器FSMC
源: STM32系列第15篇--灵活的静态存储控制器FSMC
- ANSI C和POSIX
简单的说 ANSI C:标准C API(对应fopen) POSIX:方便在Linux下运行的C API(对应open)