使用find命令进行文件批量重命名问题
- shymonk
- 帖子: 7
- 注册时间: 2012-05-31 21:25
使用find命令进行文件批量重命名问题
当前目录下有如下文件:
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命令拿到的文件结果都是带有路径前缀 ./ 的么? 有什么办法可以去掉./
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命令进行文件批量重命名问题
代码: 全选
perl-rename 's/^/new-/' *.c
另外,Vim 的 renamer.vim 插件用来干这种事特别好用,如果你会用 Vim 的话。
- shymonk
- 帖子: 7
- 注册时间: 2012-05-31 21:25
Re: 使用find命令进行文件批量重命名问题
lilydjwg 写了:在你那里,perl-rename 也可能叫作 rename 或者 rename.pl。使用 file $(which rename) 来确定你的 rename 命令是不是我指的这个 Perl 脚本。代码: 全选
perl-rename 's/^/new-/' *.c
另外,Vim 的 renamer.vim 插件用来干这种事特别好用,如果你会用 Vim 的话。
看来是我把问题搞复杂了,thx~
如果用find和basename可以实现上述功能么?
- 枫叶饭团
- 帖子: 14683
- 注册时间: 2010-06-16 1:05
- 系统: Mac OS X
- 来自: Tencent
- 联系:
Re: 使用find命令进行文件批量重命名问题
当然可以,不过你得写一堆
- cwll
- 帖子: 190
- 注册时间: 2011-07-05 11:10
Re: 使用find命令进行文件批量重命名问题
代码: 全选
find . -print | xargs -I {} cp {} {}-new

-
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
Re: 使用find命令进行文件批量重命名问题
代码: 全选
find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
-
- 帖子: 992
- 注册时间: 2007-12-05 10:57
- 系统: ubuntu14.04
- 来自: 金山
Re: 使用find命令进行文件批量重命名问题
学习!aerofox 写了:代码: 全选
find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
- shymonk
- 帖子: 7
- 注册时间: 2012-05-31 21:25
Re: 使用find命令进行文件批量重命名问题
能不能解释一下 ([^/]+)$ 的含义呢?aerofox 写了:代码: 全选
find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
另外,正则里的冒号和正斜线有什么区别啊?可以互换么?
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 使用find命令进行文件批量重命名问题
那个不是正则里的,是 Perl 等语言使用正则时的分隔符。Perl、sed、Vim 中的正则分隔符可以为各种符号,如常用的 /:=.,以避免大量转义。shymonk 写了:能不能解释一下 ([^/]+)$ 的含义呢?aerofox 写了:代码: 全选
find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
另外,正则里的冒号和正斜线有什么区别啊?可以互换么?
关于正则表达式,参见 http://deerchao.net/tutorials/regex/regex.htm
-
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
Re: 使用find命令进行文件批量重命名问题
[^/]+$ 表示位于尾部($)的不含/的字符串([^/]+),默认采用最长匹配,因而也就是最后一个/之后的部分。shymonk 写了:能不能解释一下 ([^/]+)$ 的含义呢?aerofox 写了:代码: 全选
find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
另外,正则里的冒号和正斜线有什么区别啊?可以互换么?
把[^/]+括起来是为了在替换文本中用 $1 引用它。
- shymonk
- 帖子: 7
- 注册时间: 2012-05-31 21:25
Re: 使用find命令进行文件批量重命名问题
刚才仔细看了一下正则的规则,才搞明白,多谢 :em06aerofox 写了:[^/]+$ 表示位于尾部($)的不含/的字符串([^/]+),默认采用最长匹配,因而也就是最后一个/之后的部分。shymonk 写了:能不能解释一下 ([^/]+)$ 的含义呢?aerofox 写了:代码: 全选
find . -type f -exec rename 's:([^/]+)$:new-$1:' {} \;
另外,正则里的冒号和正斜线有什么区别啊?可以互换么?
把[^/]+括起来是为了在替换文本中用 $1 引用它。
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
Re: 使用find命令进行文件批量重命名问题
-n, --no-act
No Action: show what files would have been renamed.
多看man rename
不熟悉正则,先这样调试。
No Action: show what files would have been renamed.
多看man rename
不熟悉正则,先这样调试。
● 鸣学