Chinaunix首页 | 论坛 | 博客
  • 博客访问: 239155
  • 博文数量: 52
  • 博客积分: 1492
  • 博客等级: 上尉
  • 技术积分: 554
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 15:54
文章分类
文章存档

2010年(52)

我的朋友

分类:

2010-04-21 12:38:12

要将公司网站改成灰色的,需要在每个配置文件前加上

html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);}

公司是经营wap网站业务的,网站众多,用脚本修改如下,简化之后就是下面的问题

 

问题:要将指定目录下(目录中包含子目录,子目录中也有文件a)所有文件名为a的文件,第一行添加数字111。

如果需要把一条命令在标准输出上的输出结果,转换为另一个程序或或者另一个命令的参数,可以用xargs命令。 
也可以用find的-exec这个参数


  1、find /shell -maxdepth 2 -name 'a' -print | xargs sed -i '1 i\111' 
  用find命令在/shell目录下(只查找shell目录2层以上的子目录)查找a文件,然后在每个a文件的第一行添加111,需要注意的是如果文件名字包含新行或者空格的话,这条命令将会被错误操作。 
   find /shell -maxdepth 2 -name 'a' -exec 'sed' -i '1 i\111' {} \;  这个和上面的是一个意思。


  2、find /shell -maxdepth 2 -name 'a' -print0 | xargs -0 sed -i '1 i\111' 
    这条命令和上一条意思一样。  
    但是处理了文件名字包含新行或者空格的错误
   
  3、cut -d: -f1 < /etc/passwd | sort | xargs echo
     大概列举了系统的用户。
 
  4、find /shell -maxdepth 2 -name a -print | xargs -i sed -i '1 i\111' {}
     -i 表示 find 传递给xargs的结果 由{}来代替
注意:cshell和tcshell中,需要将{}用单引号、双引号或反斜杠,否则不认识。bash可以不用。建议加上。

例如

 find /shell -maxdepth 2 -name a -print | xargs -t -i sed -i '1 i\111' {}  打印显示

  find /shell -maxdepth 2 -name a -print | xargs -p -i sed -i '1 i\111' {}询问是否执行?

 find /shell -maxdepth 2 -name a -print | xargs -t -p -i sed -i '1 i\111' {}打印显示,并询问是否执行?

 

   管道是把一个命令的输出传递给另一个命令作为输入,比如:
command1 | command2
    但是command2仅仅把输出的内容作为输入参数。
    find . -name "install.log" -print打印出的是install.log这个字符串,如果仅仅使用管道,那么command2能够使用的仅仅是install.log这个字符串,不能把它当作文件来进行处理。当然这个command2除了xargs。xargs就是为了能够对find搜索到的文件进行操作而编写的。它能把管道传来的字符串当作文件交给其后的命令执行。
举个例子:
(1)$find . -name "install.log" -print | cat
./install.log   #显示从管道传来的内容,仅仅作为字符串来处理
(2)$find . -name "install.log" -print | xargs cat
aaaaaa        #将管道传来的内容作为文件,交给cat执行。也就是说,该命令执行的是如果存在install.log,那么就打印出这个文件的内容。

   通过这个例子,应该很容易理解这样有什么不同了。当你要对匹配文件操作时,使用find and xargs。其实这都是运用了管道。xargs是shell命令的一个,可以把管道输入的内容转化为其参数要操作的文件。

阅读(4449) | 评论(0) | 转发(1) |
0

上一篇:没有了

下一篇:sed基本用法

给主人留下些什么吧!~~