首页 > 解决方案 > 查找和替换文件名递归忽略文件夹

问题描述

我正在尝试对文件夹和所有子文件夹内的一大组文件中的文件名进行规范化。我对这个命令的成功有限

find ./ -type f -name "*.txt" -print0 | xargs -0 rename 's/bob.smith/bob smith /' {} \;

此命令按预期工作,除非文件夹名称中存在“bob.smith”,其中存在文件名中包含“bob.smith”的文件。在这种情况下,我会收到以下信息:

Can't rename ./today.bob.smith.ok/1.bob.smith.344.txt ./today.bob smith.ok/1.bob.smith.344.txt: No such file or directory

标签: bash

解决方案


这应该有效:

find ./ -type f -name "*.txt" -print0 | xargs -0 rename 's/bob\.smith([^\/]+)$/bob smith $1/' {} \;

我修改了正则表达式以识别那些bob.smith没有/在他们之后的人,并且我使用了正则表达式分组((regex)$1),所以我不会丢失之后的内容bob.smith

请注意,既然你写了s/bob.smith/而不是s/bob.smith./我假设你想要.after bob.smith。结果如下所示:

1.bob smith .344.txt

另请注意,bob\.smith而不是bob.smith。在正则表达式.中表示“任何字符”。


推荐阅读