首页 > 解决方案 > 当一个字符不是使用前缀的文件名中的前 8 个字符之一时,如何查找和替换字符?

问题描述

例如,这将递归地查找并用单个空格替换所有文件名中的所有连字符:

find . -type f -name "*-*" -execdir prename 's/-/ /g' "{}" \;

我将如何修改它以仅替换不在文件名前 8 个字符内的连字符。

标签: regexshellfindrename

解决方案


由于主要,传递给prename的路径名前面带有。因此,您需要保持前十个字符完整,并用路径字符串的其余部分中的空格替换每个破折号,这可以通过 while 循环相当容易地实现(因为当匹配重叠时标志不起作用)和 PCRE 的零-width 积极的后向断言 thingy *./-execdirg

find -name '????????*-*' -type f -execdir prename -n '1 while s/.{10,}\K-/ /' {} +

prename这对每个目录至少调用一次,因此,由于初始化的开销,可能会很慢。如果这是一个问题,您可以使用-exec代替-execdir,并相应地调整 Perl 表达式。以下是我的业余尝试,请谨慎使用。

-exec prename -n '/(.*\/.{8})(.*)/; $_ = $1 . $2 =~ y/-/ /r' {} +

-n如果输出看起来不错,则丢弃。


推荐阅读