首页 > 代码库 > 一句话脚本系列之将svn有改动的文件临时备份起来

一句话脚本系列之将svn有改动的文件临时备份起来

引言

使用场景:

我所在的开发环境下,使用的是svn版本管理工具,而相对于git来讲,如果有时候改动的文件较多,但是并不是全部都需要提交(或需要按照一个case一个commit来提交),那么如何进行筛选处理呢?按照git的用法就是git add指定的文件,然后git ci即可,但是对于svn,尤其是在命令行下操作就没有办法了。

一般用法:
  1. 将已修改完成的整个目录备份一下

  2. 将暂时不需要提交的文件或代码块进行还原

  3. 提交本次修改

  4. 将备份的其他修改再覆盖回工作目录

一句话脚本用法:

TEMP_DIR=~/temp_`date "+%Y-%m-%d"` && mkdir $TEMP_DIR  && svn st -q | awk '{print $2}' | xargs -i cp {} --parents $TEMP_DIR/ -v
上面的脚本分解步骤是:
  1. 创建一个变量表示临时文件夹的名称,并且使用时间戳作为文件夹名称的一部分
  2. 创建该文件夹
  3. 将有改动的文件过滤出来(注意,这里只是针对修改的文件和增加的文件,如果是删除的则无法临时记录)
  4. 使用awk对上面svn st -q的输出结果进行过滤,每一行只显示文件名字段
  5. 将所有有改动的文件按照保持目录结构相同的方式拷贝到刚才创建的临时文件夹中

date "+%Y-%m-%d"说明

先看一下date的man手册中的描述:

SYNOPSIS
       date [OPTION]... [+FORMAT]

       FORMAT controls the output.  Interpreted sequences are:
       %Y     year
       %m     month (01..12)
       %d     day of month (e.g., 01)

在这里我们的需求是按照2015-01-07这种方式输出,即可以表示当前操作的日期即可,因此按照man手册中的说明使用date "+%Y-%m-%d"命令来得到当前的日期。
但是在写这篇博客的时候,我又详细看了一下man手册,发现实际上有另外一个格式化字符能够更简便的完成需求:
       %F     full date; same as %Y-%m-%d

那么,原来的一句话脚本就可以优化为:

TEMP_DIR=~/temp_`date "+%F"` && mkdir $TEMP_DIR  && svn st -q | awk '{print $2}' | xargs -i cp {} --parents $TEMP_DIR/ -v

svn st -q说明

同理,先看一下snv的man手册中针对st -q参数的描述:

status (stat, st): Print the status of working copy files and directories.
  -q [--quiet]             : print nothing, or only summary information

如果不使用-q参数呢,就会把所有不在版本管理的文件都会列出来,其中会有大量的中间文件(如.o、temp文件等等);而添加-q参数后,只是列出所有有改动的文件,其中包括新增、删除、修改等等。

xargs -i说明

先看一下xargs的man手册中针对-i参数的描述:

       -I replace-str
              Replace occurrences of replace-str in the initial-arguments with names read from standard input.  Also, unquoted blanks do not terminate input items; instead the separator is the newline character.  Implies -x and -L 1.

       -i[replace-str]
              This option is a synonym for -Ireplace-str if replace-str is specified, and for -I{} otherwise.   This  option is deprecated; use -I instead.

直接从man手册来看,不是很好理解,有一篇博文《xargs的i参数》使用示例演示了具体的用法,可前往一观。

我在这里使用的-i参数后,通过{}来替换前面管道传递过来的内容,以便进行cp操作。

cp --parents说明

先看一下cp的man手册中针对--parents参数的描述:

       --parents
              use full source file name under DIRECTORY

针对这个参数也有一篇博文《cp自动创建层级结构的例子》使用示例演示了具体用法,可前往一观。

我这里使用--parents参数保证拷贝过去的文件能够保持目录结构,那么在拷贝回来的时候因为目录结构一致,则可以直接在拷贝覆盖回来。

总结

本次一句话脚本使用到了以下知识:

  1. 临时变量的设置和读取
  2. date命令显示当前日期
  3. &&连接多个命令执行
  4. mkdir命令创建文件夹
  5. svn命令使用摘要的方式显示所有改动的文件列表
  6. awk输出每一行的指定字段
  7. xargs通过-i参数对每一项输入进行替换操作
  8. 通过cp --parents参数保证拷贝文件时保持目录结构

使用博客记录下来不仅是一种分享,而且对于自身来讲也是一种精炼。在对每一个命令进行分解的时候,就会发现有些是可以采用更好的方式来实现的,而如果不记录和分享下来,就会因为够用即可而不会对它进行更多的优化。

”赠人玫瑰,手有余香“,诚不欺我也!


一句话脚本系列之将svn有改动的文件临时备份起来