我正在尝试编写一个简单的cronjob,它在文件夹&嵌套在/OneDrive
中的文件,并将而非A-Z
、a-z
、0-9
或.
的文件或文件夹名称字符替换为_
。(我觉得这是解决同步错误的最简单方法。(
在这个StackExchange帖子的基础上,我使用成功地获得了大部分
zmv '**/*' '$f:h${${f:t}//[^A-Za-z0-9]/_}'
但是,此正则表达式不排除.
的,这会导致我所有文件夹中的所有文件扩展名都更改为_
(例如,file.txt
变为file_txt
(。
我不是一个高级regex用户,我使用过的这个命令的所有各种排列都会引发错误,包括:
zmv '**/*' '$f:h${${f:t}//[^.A-Za-z0-9]/_}'
zmv '**/*' '$f:h${${f:t}//[^.A-Za-z0-9]/_}'
zmv '**/*' '$f:h${${f:t}//[^A-Za-z0-9.]/_}'
我确信正确的正则表达式是显而易见的;恐怕这对我来说并不明显。
如果有人能在这里提供一些指导,并简要解释为什么我之前的尝试没有成功,我将感谢你为我理解regex做出的小小贡献。
:h
修饰符去掉了一个斜杠;这已经添加回:
zmv '**/*' '$f:h/${${f:t}//[^.A-Za-z0-9]/_}'
我不知道你提到的原始答案中为什么缺少这一点。
一些注意事项:
zmv
的-n
选项在跟踪此类问题时非常有用- 对CCD_ 14的单个调用可能不能重命名文件名和目录名;可能需要多次通过
zmv
使用文件globbing模式。全局化模式类似于正则表达式,但有许多显著的差异,因此许多正则表达式文档将不适用于此