本文所选的例子来自于《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

改动后的脚本运行结果

最新文章

  1. CentOS7和win7双系统启动项
  2. CUBRID学习笔记23 关键字列表
  3. js javascript:void(0) 真正含义
  4. jquery 当前页导航高亮显示
  5. 趋势科技4月移动client病毒报告
  6. 用curl自动登录HTTPS站点
  7. JavaWeb总结(三)—JSP
  8. udacity/CarND-Path-Planning-Project 工程详细配置过程——吐血整理
  9. redo/declare/typeset
  10. POJ 2407Relatives
  11. ADO工具类
  12. 没有显示器、网线、路由器,编辑TF卡连接树莓派
  13. PHP-循环结构-数组
  14. 【Codeforces Round 1137】Codeforces #545 (Div. 1)
  15. 『计算机视觉』FPN:feature pyramid networks for object detection
  16. hybrid几种模式
  17. echarts初探
  18. [译]Intel App Framework 3.0的变化
  19. mkfs.ext3 option
  20. python+selenium:iframe框架中多种定位

热门文章

  1. Nuxt使用scss
  2. grep和正则表达式参数
  3. elementUI增加同级下级
  4. open-falcon 前端代码在windows上运行
  5. mysql数据库中表记录的玩法
  6. 内网IP&外网IP/NAT
  7. Android:日常学习笔记(7)———探究UI开发(1)
  8. Python学习进程(15)常用内置函数
  9. ES6 随记(1)-- let 与 const
  10. Docker容器技术-基础命令