如果一个字符不是使用prename的文件名中的前8个字符之一,我该如何查找和替换它



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

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

我该如何修改它,只替换不在文件名前8个字符内的连字符。

由于-execdir是主路径,所以传递给prename的路径名以./为前缀。因此,您需要保持前十个字符的完整性,并在路径字符串的其余部分用空格替换每个短划线,这可以通过while循环(因为当匹配重叠时,g标志不起作用(和PCRE的零宽度正后顾断言thingy*很容易实现。

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

相关内容

  • 没有找到相关文章

最新更新