使用场景:
我所在的开发环境下,使用的是svn版本管理工具,而相对于git来讲,如果有时候改动的文件较多,但是并不是全部都需要提交(或需要按照一个case一个commit来提交),那么如何进行筛选处理呢?按照git的用法就是git add指定的文件,然后git ci即可,但是对于svn,尤其是在命令行下操作就没有办法了。
一般用法:将已修改完成的整个目录备份一下
将暂时不需要提交的文件或代码块进行还原
提交本次修改
一句话脚本用法:
TEMP_DIR=~/temp_`date "+%Y-%m-%d"` && mkdir $TEMP_DIR && svn st -q | awk '{print $2}' | xargs -i cp {} --parents $TEMP_DIR/ -v上面的脚本分解步骤是:
先看一下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
同理,先看一下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的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的man手册中针对--parents参数的描述:
--parents
use full source file name under DIRECTORY
针对这个参数也有一篇博文《cp自动创建层级结构的例子》使用示例演示了具体用法,可前往一观。
我这里使用--parents参数保证拷贝过去的文件能够保持目录结构,那么在拷贝回来的时候因为目录结构一致,则可以直接在拷贝覆盖回来。
本次一句话脚本使用到了以下知识:
使用博客记录下来不仅是一种分享,而且对于自身来讲也是一种精炼。在对每一个命令进行分解的时候,就会发现有些是可以采用更好的方式来实现的,而如果不记录和分享下来,就会因为够用即可而不会对它进行更多的优化。
”赠人玫瑰,手有余香“,诚不欺我也!
原文地址:http://blog.csdn.net/nfer_zhuang/article/details/42497181