每当有人在网上询问将所有大写文件重命名为小写时,我都会看到这个命令:
find "$(pwd)" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;我理解find "$(pwd)" -depth -exec rename部分。
有人能不能分解并解释重命名的regex命令,即:'s/(.*)\/([^\/]*)/$1\/\L$2/'
\/([^\/]*)而不仅仅是(.*)?$1在bash中是什么,但是$1,\L$2在rename中意味着什么?rename手册页;但是,我没有找到关于这种用法的解释。发布于 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可能不存在。
然而..。我想你可以直接跑:
find . -depth -execdir rename 'y/A-Z/a-z/' {} +"$(pwd)" (或者更简单地说,"$PWD")只用于使find生成绝对路径,而不是相对路径,但不需要这样做。-execdir在每个目录中分别运行rename,而不是在主级别上运行全部,从而解决了处理完整路径的问题。{} +而不是{} \;允许find为每次重命名调用提供多个文件。
但请注意,所有这些可能只适用于26个ASCII字母,而不适用于在实际语言中找到的其他字符(例如,ASCII)。
https://unix.stackexchange.com/questions/597974
复制相似问题