我正在使用Ubuntu上的rename
:
$ rename --version
/usr/bin/rename using File::Rename version 0.20
这是我的目录的样子:
$ tree .
.
├── awp-3
├── bar
│ └── wp-2
└── wp-foo
└── wp-1
我的目标是要将所有带有前缀wp-
的文件和文件夹重命名为static-
这是我跑的:
$ shopt -s globstar
$ rename -n 's/wp-/static-/' **
rename(awp-3, astatic-3)
rename(bar/wp-2, bar/static-2)
rename(wp-foo, static-foo)
rename(wp-foo/wp-1, static-foo/wp-1)
这几乎是我想要的。文件awp-3不应该被重命名。
所以我改为这样做:
$ rename -n 's/^wp-/static-/' **
rename(wp-foo, static-foo)
rename(wp-foo/wp-1, static-foo/wp-1)
由于某种原因,这并没有更改wp-1或wp-2的文件名。
答案 0 :(得分:0)
^
锚仅与行首匹配。我猜你要
rename -n 's%(^|/)wp-%$1static-%' **
另一种加强这种方法的方法是说wp
必须仅出现在单词边界附近。
rename -n 's/\bwp-/static-/' **
答案 1 :(得分:0)
使用rename
递归重命名文件是有问题的:您必须确保在重命名父目录之前先重命名内部文件/子目录。仅仅添加/g
修饰符以重命名所有级别(例如s!(^|/)wp-!$1static-!g
重命名(wp-foo/wp-1
,static-foo/static-1
)是行不通的。
最好使用支持递归操作的工具,例如perlmv。我建议使用基于Perl的工具,因为重命名也是基于Perl的工具,它们的工作原理类似。不幸的是,目前还没有用于perlmv的Debian / Ubuntu软件包,因此您需要通过CPAN客户端(例如cpanm -n App::perlmv
)进行安装。一旦拥有perlmv
:
% perlmv -R -de 's/^wp-/static-/' *
结果:
% tree .
.
├── awp-3
├── bar
│ └── static-2
└── static-foo
└── static-1
注意:
您不必将**
与perlmv一起使用,只需*
。
-R
用于递归。
perlmv
中的空运行模式是-d
而不是-n
。一旦看到perlmv
可以满足您的要求,您就可以省略-d
或将其替换为-v
(详细)。
您需要在指定perl代码之前添加-e
。