shell中如何用find,exec,xargs,mv命令组合批量替换文件名中的字符串
本帖最后由 weichanghe2000 于 2012-08-29 20:21 编辑大家好,我在某个目录下面有 很多文件,文件中 包括 bak 字符串, 我现在 需要 把 bak 改为_BAK_,
要求用下面的3种方法实现(即利用find,exec,xargs ,mv 命令组合来实现)
方法1: 用 find exec mv 等命令实现
方法2: 用 find xargsmv 等命令实现
方法3: 用 ls sed mv 等命令实现
原文件 替换后的文件
archbak1.txt 替换为 arch_BAK_1.txt
archbak2_con.ini 替换为 arch_BAK_2_con.ini
...............
先谢谢大家了,在线等。 本帖最后由 rdcwayx 于 2012-08-30 13:41 编辑
如果是作业的话,自己先试一下吧 本帖最后由 weichanghe2000 于 2012-08-30 08:18 编辑
回复 2# rdcwayx
不是作业啊。是一个脚本程序中要用的。
我自己弄了一个下午和一个晚上,也没搞定,所以来这里求助。
别人给出答案,希望版主不要删除,我是新手,想在这里向大家请教和学习,望版主成全,谢谢。
求大侠帮忙。
本帖最后由 rdcwayx 于 2012-08-30 10:28 编辑
但是奇怪的是,为何指定要三种方法?
方法一 和方法二其实是差不多的, 你自己 man find 看一下。find 条件 -exec mv 命令
find 条件 |xargs mv 命令 这是语文老师的命题作文吧。 本帖最后由 weichanghe2000 于 2012-08-30 09:38 编辑
回复 4# rdcwayx
为什么要指定3种方法,是因为 我查阅了一个帖子 用了 4种方法,但是我这4种方法,我都执行过了,没有一种对的。所以 我想要得到正确的写法。
原来的方法如下:
1. find ./ -name xxx -exec mv {} {}.xx \
这个是最简单的了,但是有一点不好的是只能在后面加个后缀
2.find ./ -name xxx | xargs -I mv {} {}.xx
一样的道理
3.find ./ -name XXX | awk ''{printf("mv %s \t %s \n",$1,$1)}'' |sh
awk 里面可以自由发挥 单纯的对文件名处理来说 还不是awk的强项
4.那就来sed吧
find ./ -name xxx | sed ''s/XXX/mv xxx xxxxx/'' |sh
效率 注意效率!
创建进程的消耗是很大的,所以能用xargs的时候就不要用 |sh
ls -1|sed ''s/.old$//''|xargs -I {} mv {}.old {}
版主您好,你那种写法架构,我昨天试过了,总是出错,能否给出完整的命令? 本帖最后由 rdcwayx 于 2012-08-30 14:00 编辑
看样子是误会了,如果你一开始就贴出上贴,大家就容易理解了。
你看到的帖子和你现在的要求是不一样的,这样的话,就不能用简单的find + exec + rm 或者 find + xargs 命令来实现。这个你也试过了。
可能你的目的是要在一行内完成,就纠结在这个oneliner 上了。
如果系统支持的话,一条rename 就可以。rename bak _BAK_ *bak*如果不支持,我想到的方法如下:find . -name "*bak*" -type f |while read file
do
new=${file/bak/_BAK_} # 这一步可以用sed, awk 命令替换
mv $file $new
done
echo "123bak1.txt"|awk 'BEGIN{FS="bak";OFS="_BAK_"}{printf "mv "$0" ";$1=$1;print $0}' 回复 6# weichanghe2000
how about this, you can check output with no problem and change "echo" to "mv" to rename them.
# ls *bak* | awk '{org=$0;gsub("bak","_BAK_");system("echo "org" "$0)}'
archbak1.txt arch_BAK_1.txt
archbak2_con.ini arch_BAK_2_con.ini
学习了。:wink: