分页: 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
呵呵,加个后缀可以,前缀有点麻烦。

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
不熟悉正则,先这样调试。