首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >L$2在perl重命名工具中意味着什么?

L$2在perl重命名工具中意味着什么?
EN

Unix & Linux用户
提问于 2020-07-11 18:37:14
回答 1查看 149关注 0票数 0

每当有人在网上询问将所有大写文件重命名为小写时,我都会看到这个命令:

代码语言:javascript
复制
find "$(pwd)" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

我理解find "$(pwd)" -depth -exec rename部分。

有人能不能分解并解释重命名的regex命令,即:'s/(.*)\/([^\/]*)/$1\/\L$2/'

  • 为什么是\/([^\/]*)而不仅仅是(.*)
  • 我知道$1在bash中是什么,但是$1\L$2rename中意味着什么?
  • 我还想知道,这与简单的查找"$(pwd)“-depth -exec rename‘y/a/a/’{}有什么不同?
  • 最后,你推荐什么样的书或资源来学习这类东西?我阅读了rename手册页;但是,我没有找到关于这种用法的解释。
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-07-11 19:30:35

第一个s/,最后一个/和中间的未转义的/是替代运算符和分隔符,所以我们有模式(.*)\/([^\/]*)和替换$1\/\L$2

(.*)\/([^\/]*)中,第一个(.*)\/匹配到最后一个斜杠的所有内容,即最后一个文件名之前的路径。最后一个([^\/]*)然后匹配任何东西,但不斜杠到字符串的末尾。

在替换中,$1返回括号中第一个捕获组匹配的内容,即路径。然后,\L将下面的部分、第二个捕获的组$2或文件名小写。

这里的最终结果是,低强制只适用于最后的文件名部分,因此,例如dir/OTHERDIR/FOO.txt转向dir/OTHERDIR/foo.txt,而不是dir/otherdir/foo.txt。直接将名称重命名到后者是行不通的,因为dir/otherdir可能不存在。

然而..。我想你可以直接跑:

代码语言:javascript
复制
find . -depth -execdir rename 'y/A-Z/a-z/' {} +

"$(pwd)" (或者更简单地说,"$PWD")只用于使find生成绝对路径,而不是相对路径,但不需要这样做。-execdir在每个目录中分别运行rename,而不是在主级别上运行全部,从而解决了处理完整路径的问题。{} +而不是{} \;允许find为每次重命名调用提供多个文件。

但请注意,所有这些可能只适用于26个ASCII字母,而不适用于在实际语言中找到的其他字符(例如,ASCII)。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/597974

复制
相关文章

相似问题

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