我正在尝试在 MacOS Big Sur 上编写一个 zsh 脚本,该脚本将递归地重命名一些具有我不想要的特殊字符的文件和目录。我已经研究了好几天了,每次我认为我已经解决了它,我就会遇到一个新问题。基本上已经完成了,除了当我在试运行模式下运行 find 命令时:
find . -d -type f -execdir rename -n -X ${=CHARACTER_SUBSTITUTIONS} {} +
我在测试文件夹中获得了正确的文件列表:
'untitled file3 [].txt' 将被重命名为 'untitled file3 --.txt'
'untitled file2。 [].txt”将被重命名为“无标题文件2”。 - 。TXT'
但是当我为 realsies 运行它时,它再也找不到它们了:
find . -d -type f -execdir rename -X ${=CHARACTER_SUBSTITUTIONS} {} +
结果:
无法将“无标题文件3 [].txt”重命名为“无标题文件3 --.txt”:没有这样的文件或目录
无法重命名“无标题文件2”。 [].txt' 到 '无标题文件2。 --.txt': 没有这样的文件或目录
把我的头撞到墙上。任何帮助将不胜感激。
如果相关的话,CHARACTER_SUBSTITUTIONS 只是我想要制作的一长串替代品。
echo ${=CHARACTER_SUBSTITUTIONS}
-S [ - -S ] - -S + - -S # - -S % - -S { - -S } - -S \ - -S < - -S > - -S * - -S ? - -S $ - -S ! - -S : - -S @ - -S ` - -S | - -S ' - -S " - -S & - -S - -S = -
详细信息:
zsh
MacOS Big Sur
重命名v1.601(基于 Perl 的变体之一)
答案1
既然你使用的是 Zsh,我就使用zmv
为此而不是find
:
% autoload -Uz zmv
% zmv -n '(**/)(*)(#q.)' '$1${2//[^. [:IDENT:]]/-}' # -n: no execute
mv -- 'untitled file2 [].txt' 'untitled file2 --.txt'
mv -- 'untitled file3 [].txt' 'untitled file3 --.txt'
% zmv -v '(**/)(*)(#q.)' '$1${2//[^. [:IDENT:]]/-}' # -v: verbose
mv -- 'untitled file2 [].txt' 'untitled file2 --.txt'
mv -- 'untitled file3 [].txt' 'untitled file3 --.txt'
%
[^. [:IDENT:]]
匹配任何不是shell 标识符的点、空格或有效部分。(#q.)
是将重命名限制为常规文件,例如您的-type f
.
欲了解更多信息: