用wget镜像网站一例(涉及wget & find & xargs & exec知识)

[bash]wget -mk -w 10 http://cwgl.xzit.edu.cn/[/bash]

-w 10代表间隔10秒下载一个文件,避免频繁访问网站引起不必要的误会。
可以用-A参数指定UA -k表示替换绝对路径为相对路径
下载回来以后 把所有asp文件(非文件夹,文件夹用-type d)重命名为html,

[bash]find . -name "*.asp" -type f | awk -F ".asp$" '{print $1}' | xargs -i mv {}.asp {}.html[/bash]

或者也可以这样实现

[bash]find ./ -type f -name "*.asp" -exec rename 's/\.asp/\.html/g' {} \;[/bash]

并且对文件里面超链接进行替换

[bash]find . -name "*.html" -exec sed -ie "s/\.asp/\.html/g" {} \;[/bash]

-exec 参数后面跟的是 command命令,注意点如下:

command命令的终止,使用 ';' (分号)来判定,在后面必须有一个 ';'

'{}',使用{}来表示文件名,也就是find前面处理过程中过滤出来的文件,用于command命令进行处理

特别强调,对于不同的系统,直接使用分号可能会有不同的意义, 所以使用转义符 '\'在分号前明确说明

进阶用途

[bash]#删除目录和子目录中的所有空文件
find . -empty -exec rm '{}' \; [/bash]

exec 能接受的长度有些系统会有限制 ,所以xargs 就不可替代了,xargs 接到参数就开始处理 而不是像exec, 非要接受到全部 才开始执行

exec 与 xargs的区别

xargs:通过缓冲方式并以前面命令行的输出作为参数,随后的命令调用该参数
如果不考虑xargs的扩展选项
command1 |xargs command2 可以理解为
command2 command1

因此, find .... | xargs rm 和 rm find ... 等效
但是, 若 find 的结果太多, 可能会超过rm 可能接受的最大参数数量而失败.
xargs优点:由于是批处理的,所以执行效率比较高(通过缓冲方式缓冲所有参数后一次性发送给command2)
xargs缺点:有可能由于参数数量过多(成千上万),导致后面的命令command2执行失败

这个也是exec的“优点”
若换成 find ....-exec rm {} \; 的话,不会出现上面的问题,假设find到了成千上万个文件,那么就会每个文件作为参数发送给一个rm去执行,要发起成千上万个rm才能执行完毕,这样速度虽然慢了,但是能保证不出问题。

xargs的 -0参数可以防止文件名里面有空格导致传递错误的意思和参数

比如

find ./ -type d -name ".svn"|xargs rm -rf

在大部分情况下都可以工作的很好,但是如果路径中有空格,这些空格目录里面的文件就不会被删除

find有一个参数-print0,和默认的-print相比,输出的序列不是以空格分隔,而是以null字符分隔。而xargs也有一个参数-0,可以接受以null而非空格间隔的输入流,这样,上面的方法换成这样更具有通用性

find ./ -type d -name ".svn" -print0 |xargs -0 rm -rf

Author Info :
  • From:用wget镜像网站一例(涉及wget & find & xargs & exec知识)
  • URL:https://blog.ihipop.com/2011/06/2515.html
  • Please Reserve This Link,Thanks!
  • 发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注