perl 重命名工具中 \L$2 是什么意思?

perl 重命名工具中 \L$2 是什么意思?

每当有人在线询问有关将所有大写文件重命名为小写的问题时,我都会看到建议使用此命令:

find "$(pwd)" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

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

有人可以分解并解释重命名的正则表达式命令 - 即:'s/(.*)\/([^\/]*)/$1\/\L$2/'

  • 为什么\/([^\/]*)而且不仅如此(.*)

  • 我知道$1bash 中的内容是什么,但是$1,是什么\L$2意思rename

  • 我也很想知道这与简单的有什么不同

    find "$(pwd)" -depth -exec rename 'y/A-Z/a-z/' {} \;
    
  • 最后,您会推荐哪些书籍或资源来学习此类内容?我读了rename手册页;但是,我没有找到有关此类用法的解释。

答案1

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

(.*)\/([^\/]*)一个(.*)\/匹配直到最后一个斜杠的所有内容,即最终文件名之前的路径。最后一个([^\/]*)匹配除斜线到字符串末尾之外的任何内容。

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

这里的最终结果是小写仅适用于最终文件名部分,因此例如dir/OTHERDIR/FOO.txt变为dir/OTHERDIR/foo.txt,而不是dir/otherdir/foo.txt。直接重命名为后者是行不通的,因为dir/otherdir可能不存在。


但是......我认为你可以运行:

find . -depth -execdir rename 'y/A-Z/a-z/' {} +

"$(pwd)"(或者更简单地说,"$PWD")仅适用于生成find绝对路径,而不是相对路径,但没有必要这样做。在每个目录中单独-execdir运行rename,而不是在主级别中全部运行,从而摆脱了处理完整路径的问题。而{} +不是{} \;find每次重命名调用都提供多个文件。

但请注意,所有这些可能仅适用于 26 个 ASCII 字母,不适用于实际语言中发现的其余字符(例如 äöåé)。

相关内容