当一个字符不是文件名中的前 8 个字符之一时,如何使用 prename 查找和替换该字符?
How do I find and replace a character when it is not one of the first 8 characters in the filename using prename?
例如,这将递归地查找所有文件名中的所有连字符并将其替换为单个 space:
find . -type f -name "*-*" -execdir prename 's/-/ /g' "{}" \;
我该如何修改它以仅替换不在文件名前 8 个字符内的连字符。
传递给 prename
的路径名以 ./
为前缀,因为 -execdir
是主路径。因此,您需要保持前 10 个字符完整,并在路径字符串的其余部分用 space 替换每个破折号,这可以通过 while 循环很容易地实现(因为 g
标志在匹配重叠时不起作用)和 PCRE 的 zero-width positive lookbehind assertion thingy .
find -name '????????*-*' -type f -execdir prename -n '1 while s/.{10,}\K-/ /' {} +
这会为每个目录至少调用一次 prename
,因此,由于初始化的开销,速度可能会很慢。如果这是一个问题,您可以使用 -exec
而不是 -execdir
,并相应地调整 Perl 表达式。以下是我的业余尝试,慎用
-exec prename -n '/(.*\/.{8})(.*)/; $_ = . =~ y/-/ /r' {} +
如果输出看起来不错,请删除 -n
。
例如,这将递归地查找所有文件名中的所有连字符并将其替换为单个 space:
find . -type f -name "*-*" -execdir prename 's/-/ /g' "{}" \;
我该如何修改它以仅替换不在文件名前 8 个字符内的连字符。
传递给 prename
的路径名以 ./
为前缀,因为 -execdir
是主路径。因此,您需要保持前 10 个字符完整,并在路径字符串的其余部分用 space 替换每个破折号,这可以通过 while 循环很容易地实现(因为 g
标志在匹配重叠时不起作用)和 PCRE 的 zero-width positive lookbehind assertion thingy
find -name '????????*-*' -type f -execdir prename -n '1 while s/.{10,}\K-/ /' {} +
这会为每个目录至少调用一次 prename
,因此,由于初始化的开销,速度可能会很慢。如果这是一个问题,您可以使用 -exec
而不是 -execdir
,并相应地调整 Perl 表达式。以下是我的业余尝试,慎用
-exec prename -n '/(.*\/.{8})(.*)/; $_ = . =~ y/-/ /r' {} +
如果输出看起来不错,请删除 -n
。