巧用find -exec xargs处理文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Linux下少不了用工具整理各种文件:查找/替换字符串、改名、备份、打包等等。下面逐一介绍find这一强大命令的妙用。
1. 添加后缀名
find . -name "xyz" -print | xargs -t -i mv '{}' '{}'.log
xargs 的选项 -t 是显示它后面待执行的命令(方便调试用) -i 将命令行中的{}解析成前面find输出的内容。
find一般用-print输出匹配的文件的结果,是一个从当前目录开始的相对路径。
find的一个好处就是遍历给定目录执行查找任务,省去了写很多复杂的遍历脚本。
2. -exec的用法
上面例子的-exec的版本如下:
find . -name "xyz" -print -exec mv '{}' '{}'.log \;
使用-exec时,注意它后面的命令以 \; 结尾,{} 意义同上。
3. 更强大灵活的功能——使用自定义脚本完成复杂的文件操作
比如,我现在要将一目录下(包含子目录)所以文件*.sp文件改名成test.cir,并在'.end'前面插入一行。想当然的实现方法如下:
find . -name "*.sp" -print -exec perl -pi -e 's/\.end/\$\(XYYUSA\)/g' {} \; -exec echo ".end" >> {} \; -exec mv {} `dirname {}`/test.cir \;
解释一下,直观的看来该任务首先用find查找到符合条件的文件,然后用-exec调用perl命令实现下面字符串的替换,然后再在
.end -----> $(XYYUSA)
它后面添加'.end',最后再使用-exec将文件改名。
但这里面有很多问题,首先重定>>不被find的-exec支持(用xargs也一样),其次`basename {}`取不到该文件的相对路径(why?),这时你得到的结果是在你当前目录下生成这个test.cir文件了。
正确的方案就是将你需要实现的操作(也就是三条exec命令)放入一个脚本中,让find使用-exec或xargs把匹配的文件作为第一个参数传入脚本中,实现如下:
---脚本文件batx.sh
#!/bin/sh
perl -pi -e 's/\.end/\$\(XYYUSA\)/g' $1
echo ".end" >> $1
mv $1 `dirname $1`/test.cir
---find命令变得很简洁了
find . -name "*.sp" -print -exec ./batx.sh {} \;
现在一个复杂的任务就可分解成一条命令加上一个用户自定义的脚本完成了。同样的道理这一思路可以延伸出很多实际的用法,尤其是需要遍历整个路径,而且需要对这些文件进行复杂的操作之时,上述方法就有了用武之地