本文所选的例子来自于《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》学习(九):备份最后一天所有修改的文件的更多相关文章

  1. C0304 备份最后一天所有修改的文件

    #! /bin/bash backupfile=backup-$(date +%m-%d-%Y) archive=${1:-$backupfile} # 上边内容, 参数替换 ${} echo $ar ...

  2. advanced bash shell guide读书笔记

    http://note.youdao.com/noteshare?id=fc23a679849b4627d131d3ef07c74a71

  3. 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 ...

  4. [terry笔记]RMAN综合学习之备份

    rman是最经济实惠的oracle备份工具,在这里做一个rman的整体学习. 文章中大多是rman命令的语法,还是最好做做实验,以便印象深刻,因为大多数数据库的备份就是按时跑脚本,恢复也不是经常能遇到 ...

  5. RMAN综合学习之备份

    rman是最经济实惠的oracle备份工具,在这里做一个rman的整体学习. 文章中大多是rman命令的语法,还是最好做做实验,以便印象深刻,因为大多数数据库的备份就是按时跑脚本,恢复也不是经常能遇到 ...

  6. 《DOM Scripting》学习笔记-——第三章 DOM

    <Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...

  7. 《DOM Scripting》学习笔记-——第二章 js语法

    <Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...

  8. Shell 实例:备份最后一天内所有修改过的文件

    在一个"tarball"中(经过 tar 和 gzip 处理过的文件)备份最后 24 小时之内当前目录下所有修改的文件. 程序代码如下: #!/bin/bash BACKUPFIL ...

  9. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

随机推荐

  1. 一个jsp页面引入另一个jsp页面的三种方式 及静态引入和动态引入的区别

    转载下, 转载自:http://blog.csdn.net/fn_2015/article/details/70311495 1.第一种:jstl  import <c:import url=& ...

  2. Java源码之String

    本文出自:http://blog.csdn.net/dt235201314/article/details/78330377 一丶概述 还记得那会的“Hello World”,第一个程序,输出的Str ...

  3. 类加载器(ClassLoader)

    1. 类加载器概述 1.1 类加载器的作用 把 .class 文件加载到 JVM 的方法区中,变成一个 Class 对象! 1.2 类加载器分类 类加载器也是一个类: ClassLoader; Jav ...

  4. 0404-服务注册与发现-客户端负载均衡-两种自定义方式-Ribbon通过代码自定义配置、使用配置文件自定义Ribbon Client

    一.官方文档解读 官方地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_cust ...

  5. JavaScript+css+ div HTML遮罩層效果

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Test</title ...

  6. Python2 socket TCPServer 多线程并发 超时关闭

    在阿里云上测试过,可以直接使用. 用IP和端口发送数据,会返回echo:+接收到的数据 #coding=utf-8 import socket import threading,getopt,sys, ...

  7. Java CLASSPATH

    @1:CLASSPATH用途: #1:给import指路 -- import后面的包名(转换为相应的路径后)与CLASSPATH中的各项相连接. 然后解释器从这些路径(前面连接之后的结果)中查找程序中 ...

  8. 2015.7.2 想做T再次失败

    2015.7.2教训:不要心存侥幸! 1.昨天收盘急跌,加上看到成交量在增加,负荷庄家行为第五条,一时脑热就去抄了.其实在震荡行情下,第二天肯定有时间点比头一天的收盘价低(Pic1) 2.T+0原则: ...

  9. range开始节点和结束节点

    sc = range.startContainer, so = range.startOffsest ec = range.endContainer, eo=range.endOffset   sta ...

  10. Yii2 自定义独立验证器

    新建一个文件: ?php /** * author : forecho <caizhenghai@gmail.com> * createTime : 2015/7/1 14:54 * de ...