zsh find -execdir 重命名“没有这样的文件或目录”

zsh find -execdir 重命名“没有这样的文件或目录”

我正在尝试在 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.

欲了解更多信息:

相关内容