通过扩展名查找文件并替换搜索模式前后的字符

通过扩展名查找文件并替换搜索模式前后的字符

我需要按扩展名查找文件,并将搜索模式之前的随机字符替换为指定文本(已替换),将此模式后面的数字转换为递增计数器,并将它们移动到另一个文件夹。示例如下:

按扩展名 .EXT 查找文件

/opt/files/QvmBIsB3_PATTERN_77580.EXT
/opt/files/8iV8QhFwQos_PATTERN_77580.EXT
/opt/files/lgI6JUEh55za488_PATTERN_77580.EXT

更改它们并替换到另一个文件夹:

/opt/replaced/REPLACED_PATTERN_1.EXT
/opt/replaced/REPLACED_PATTERN_2.EXT
/opt/replaced/REPLACED_PATTERN_3.EXT

答案1

有了 zsh,感谢兹马夫:

autoload -zU zmv
n=1
zmv -n '/opt/files/*_(PATTERN)_*(.EXT)' '/opt/replaced/REPLACED_PATTERN_$((n++))$2'

说明:

  • 第一个参数zmv是一个 shell 模式,标识要重命名的文件。
  • 第二个参数是替换文本。
  • 您可以在替换文本中使用$1$2等来使用与模式中括号内的组匹配的部分。
  • $((n++))$n使用其当前值后递增。
  • 如果您满意,请删除-n以实际执行任务。

或者,您可以使用基于PerlprenamerenameDebian 中的包)。与 zmv 相比,它的优点是在 Debian 上默认安装,但缺点是它对于包括本任务在内的许多任务来说更加神秘。

prename -n 'BEGIN {our $n = 1} our $n; s!.*_(PATTERN)_[0-9]+(\..*)$!/opt/replaced/REPLACED_PATTERN_$n$2! and ++$n' /opt/files/*_PATTERN_*.EXT

说明:

  • 第一个参数prename是要对每个文件名执行的 Perl 表达式。隐式变量的旧值$_是当前文件名,并且在计算表达式后将文件重命名为新值。
  • BEGIN {…}$n在对文件名运行循环之前进行初始化。our $n声明$n为全局变量,以便它可以在 BEGIN 块和主表达式中使用。
  • s!…!…!执行正则表达式替换。
  • 正则表达式匹配整个文件中所需的模式(因为它以.*以下开头和结尾$- 请注意,为简单起见,我假设您的文件名不包含换行符)。无论匹配项PATTERN保存在什么位置$1,扩展名都保存在$2(两个括号内的组)中。
  • 替换在不同的目录中构造一个新的文件名。
  • and ++$n如果模式匹配,则增加计数器。
  • 如果您满意,请删除-n以实际执行任务。

相关内容