每当有人在线询问有关将所有大写文件重命名为小写的问题时,我都会看到建议使用此命令:
find "$(pwd)" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
我理解这find "$(pwd)" -depth -exec rename
部分。
有人可以分解并解释重命名的正则表达式命令 - 即:'s/(.*)\/([^\/]*)/$1\/\L$2/'
为什么
\/([^\/]*)
而且不仅如此(.*)
?我知道
$1
bash 中的内容是什么,但是$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 字母,不适用于实际语言中发现的其余字符(例如 äöåé)。