在Ubuntu中使用重命名以递归方式更改文件前缀(正则表达式不起作用)

时间:2019-01-14 05:47:24

标签: regex bash ubuntu

我正在使用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的文件名。

如何使用重命名将wp-2,wp-foo和wp-1更改为static-*?

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-1static-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