首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用重命名在Ubuntu中递归地更改文件前缀(regex不工作)

使用重命名在Ubuntu中递归地更改文件前缀(regex不工作)
EN

Stack Overflow用户
提问于 2019-01-14 05:47:23
回答 2查看 129关注 0票数 2

我正在使用在ubuntu中可用的rename

代码语言:javascript
复制
$ rename --version
/usr/bin/rename using File::Rename version 0.20

我的目录是这样的:

代码语言:javascript
复制
$ tree .
.
├── awp-3
├── bar
│   └── wp-2
└── wp-foo
    └── wp-1

我的目标是将所有文件和文件夹重命名为,前缀为wp-static-

我就是这么跑的:

代码语言:javascript
复制
$ 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不应该被重命名。

所以我就这么做了:

代码语言:javascript
复制
$ 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更改为静态-*

EN

回答 2

Stack Overflow用户

发布于 2019-01-14 06:04:53

^锚点只匹配行的开头。我猜你想

代码语言:javascript
复制
rename -n 's%(^|/)wp-%$1static-%' **

另一种加强这一点的方法是说,wp必须只发生在一个单词边界附近。

代码语言:javascript
复制
rename -n 's/\bwp-/static-/' **
票数 0
EN

Stack Overflow用户

发布于 2019-01-15 09:42:18

使用rename递归地重命名文件是有问题的:您必须确保在重命名父目录之前首先重命名内部文件/子目录。简单地添加/g修饰符来重命名所有级别(例如,从s!(^|/)wp-!$1static-!g到rename(wp-foo/wp-1static-foo/static-1) )将无法工作。

最好使用支持递归操作的工具,如波尔姆。我建议使用基于perl的工具,因为rename也是一个基于perl的工具,它们的工作方式类似。不幸的是,还没有用于perlmv的Debian/Ubuntu包,因此您需要通过CPAN客户端(例如cpanm -n App::perlmv)安装它。一旦你有了perlmv

代码语言:javascript
复制
% perlmv -R -de 's/^wp-/static-/' *

结果:

代码语言:javascript
复制
% tree .
.
├── awp-3
├── bar
│   └── static-2
└── static-foo
    └── static-1

备注:

  • 您不必在perlmv中使用**,只需使用*
  • -R用于递归。
  • perlmv中的试运行模式是-d而不是-n。一旦您看到perlmv可以做您想做的事情,您就可以省略-d,或者用-v (详细)替换它。
  • 您需要在指定perl代码之前添加-e
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54176291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档