我需要按扩展名查找文件,并将搜索模式之前的随机字符替换为指定文本(已替换),将此模式后面的数字转换为递增计数器,并将它们移动到另一个文件夹。示例如下:
按扩展名 .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
以实际执行任务。
或者,您可以使用基于Perlprename
(rename
Debian 中的包)。与 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
以实际执行任务。