分页: 1 / 1

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

发表于 : 2012-07-31 1:15
shymonk
当前目录下有如下文件:

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命令拿到的文件结果都是带有路径前缀 ./ 的么? 有什么办法可以去掉./

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

发表于 : 2012-07-31 1:24
lilydjwg

代码: 全选

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

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

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

发表于 : 2012-07-31 1:33
shymonk
lilydjwg 写了:

代码: 全选

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

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

看来是我把问题搞复杂了,thx~
如果用find和basename可以实现上述功能么?

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

发表于 : 2012-07-31 2:28
枫叶饭团
当然可以,不过你得写一堆

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

发表于 : 2012-07-31 11:12
cwll

代码: 全选

find .  -print | xargs -I {} cp {} {}-new
呵呵,加个后缀可以,前缀有点麻烦。 :em06

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

发表于 : 2012-07-31 21:10
aerofox

代码: 全选

find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;

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

发表于 : 2012-07-31 21:29
cao627
aerofox 写了:

代码: 全选

find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
学习!

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

发表于 : 2012-08-01 0:00
shymonk
aerofox 写了:

代码: 全选

find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
能不能解释一下 ([^/]+)$ 的含义呢?
另外,正则里的冒号和正斜线有什么区别啊?可以互换么?

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

发表于 : 2012-08-01 9:59
lilydjwg
shymonk 写了:
aerofox 写了:

代码: 全选

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

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

发表于 : 2012-08-01 12:53
aerofox
shymonk 写了:
aerofox 写了:

代码: 全选

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

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

发表于 : 2012-08-01 14:57
shymonk
aerofox 写了:
shymonk 写了:
aerofox 写了:

代码: 全选

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

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

发表于 : 2012-08-01 15:20
eexpress
-n, --no-act
No Action: show what files would have been renamed.

多看man rename

不熟悉正则,先这样调试。