使用find命令进行文件批量重命名问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
shymonk
帖子: 7
注册时间: 2012-05-31 21:25

使用find命令进行文件批量重命名问题

#1

帖子 shymonk » 2012-07-31 1:15

当前目录下有如下文件:

a.c
b.c
c.c
d.c

我希望通过一条find命令,给所有文件加上前缀'new-' , 命令如下:

john@john-laptop:~/workspace/tmp$ find . -type f -exec rename 's/^/my/' {} \;
Can't rename ./e.c my./e.c: No such file or directory
Can't rename ./b.c my./b.c: No such file or directory
Can't rename ./a.c my./a.c: No such file or directory
Can't rename ./d.c my./d.c: No such file or directory
Can't rename ./c.c my./c.c: No such file or directory

find命令拿到的文件结果都是带有路径前缀 ./ 的么? 有什么办法可以去掉./
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 使用find命令进行文件批量重命名问题

#2

帖子 lilydjwg » 2012-07-31 1:24

代码: 全选

perl-rename 's/^/new-/' *.c
在你那里,perl-rename 也可能叫作 rename 或者 rename.pl。使用 file $(which rename) 来确定你的 rename 命令是不是我指的这个 Perl 脚本。

另外,Vim 的 renamer.vim 插件用来干这种事特别好用,如果你会用 Vim 的话。
头像
shymonk
帖子: 7
注册时间: 2012-05-31 21:25

Re: 使用find命令进行文件批量重命名问题

#3

帖子 shymonk » 2012-07-31 1:33

lilydjwg 写了:

代码: 全选

perl-rename 's/^/new-/' *.c
在你那里,perl-rename 也可能叫作 rename 或者 rename.pl。使用 file $(which rename) 来确定你的 rename 命令是不是我指的这个 Perl 脚本。

另外,Vim 的 renamer.vim 插件用来干这种事特别好用,如果你会用 Vim 的话。

看来是我把问题搞复杂了,thx~
如果用find和basename可以实现上述功能么?
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 使用find命令进行文件批量重命名问题

#4

帖子 枫叶饭团 » 2012-07-31 2:28

当然可以,不过你得写一堆
头像
cwll
帖子: 190
注册时间: 2011-07-05 11:10

Re: 使用find命令进行文件批量重命名问题

#5

帖子 cwll » 2012-07-31 11:12

代码: 全选

find .  -print | xargs -I {} cp {} {}-new
呵呵,加个后缀可以,前缀有点麻烦。 :em06
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 使用find命令进行文件批量重命名问题

#6

帖子 aerofox » 2012-07-31 21:10

代码: 全选

find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 使用find命令进行文件批量重命名问题

#7

帖子 cao627 » 2012-07-31 21:29

aerofox 写了:

代码: 全选

find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
学习!
头像
shymonk
帖子: 7
注册时间: 2012-05-31 21:25

Re: 使用find命令进行文件批量重命名问题

#8

帖子 shymonk » 2012-08-01 0:00

aerofox 写了:

代码: 全选

find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
能不能解释一下 ([^/]+)$ 的含义呢?
另外,正则里的冒号和正斜线有什么区别啊?可以互换么?
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 使用find命令进行文件批量重命名问题

#9

帖子 lilydjwg » 2012-08-01 9:59

shymonk 写了:
aerofox 写了:

代码: 全选

find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
能不能解释一下 ([^/]+)$ 的含义呢?
另外,正则里的冒号和正斜线有什么区别啊?可以互换么?
那个不是正则里的,是 Perl 等语言使用正则时的分隔符。Perl、sed、Vim 中的正则分隔符可以为各种符号,如常用的 /:=.,以避免大量转义。
关于正则表达式,参见 http://deerchao.net/tutorials/regex/regex.htm
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 使用find命令进行文件批量重命名问题

#10

帖子 aerofox » 2012-08-01 12:53

shymonk 写了:
aerofox 写了:

代码: 全选

find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
能不能解释一下 ([^/]+)$ 的含义呢?
另外,正则里的冒号和正斜线有什么区别啊?可以互换么?
[^/]+$ 表示位于尾部($)的不含/的字符串([^/]+),默认采用最长匹配,因而也就是最后一个/之后的部分。
把[^/]+括起来是为了在替换文本中用 $1 引用它。
头像
shymonk
帖子: 7
注册时间: 2012-05-31 21:25

Re: 使用find命令进行文件批量重命名问题

#11

帖子 shymonk » 2012-08-01 14:57

aerofox 写了:
shymonk 写了:
aerofox 写了:

代码: 全选

find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
能不能解释一下 ([^/]+)$ 的含义呢?
另外,正则里的冒号和正斜线有什么区别啊?可以互换么?
[^/]+$ 表示位于尾部($)的不含/的字符串([^/]+),默认采用最长匹配,因而也就是最后一个/之后的部分。
把[^/]+括起来是为了在替换文本中用 $1 引用它。
刚才仔细看了一下正则的规则,才搞明白,多谢 :em06
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 使用find命令进行文件批量重命名问题

#12

帖子 eexpress » 2012-08-01 15:20

-n, --no-act
No Action: show what files would have been renamed.

多看man rename

不熟悉正则,先这样调试。
● 鸣学
回复