weichanghe2000 发表于 2012-08-29 20:13

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 08:12

本帖最后由 rdcwayx 于 2012-08-30 13:41 编辑

如果是作业的话,自己先试一下吧

weichanghe2000 发表于 2012-08-30 08:17

本帖最后由 weichanghe2000 于 2012-08-30 08:18 编辑

回复 2# rdcwayx

不是作业啊。是一个脚本程序中要用的。
我自己弄了一个下午和一个晚上,也没搞定,所以来这里求助。
别人给出答案,希望版主不要删除,我是新手,想在这里向大家请教和学习,望版主成全,谢谢。
求大侠帮忙。


   

rdcwayx 发表于 2012-08-30 08:28

本帖最后由 rdcwayx 于 2012-08-30 10:28 编辑

但是奇怪的是,为何指定要三种方法?

方法一 和方法二其实是差不多的, 你自己 man find 看一下。find 条件 -exec mv 命令
find 条件 |xargs mv 命令

seesea2517 发表于 2012-08-30 09:28

这是语文老师的命题作文吧。

weichanghe2000 发表于 2012-08-30 09:30

本帖最后由 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 11:55

本帖最后由 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

dn833 发表于 2012-08-30 12:11

echo "123bak1.txt"|awk 'BEGIN{FS="bak";OFS="_BAK_"}{printf "mv "$0" ";$1=$1;print $0}'

jason680 发表于 2012-08-30 12:50

回复 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

   

blackold 发表于 2012-08-30 13:08

学习了。:wink:
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: shell中如何用find,exec,xargs,mv命令组合批量替换文件名中的字符串