如何将文件重命名为其文件名中的特定字符串

如何将文件重命名为其文件名中的特定字符串

我有大量 .json 文件需要重命名为每个文件名称中的特定数字字符串。它们遵循以下格式:

[Artist] Title (Date) [Language][Publisher][Website.####][Pages].json

“####”代表一个唯一的数字 ID,我需要将每个文件重命名为该 ID,长度范围为 1-4 个字符。它应该看起来像这样:

####.json

我怎样才能实现这个目标?

答案1

zsh

autoload -Uz zmv
zmv -n '*\[*.(<->)\]\[*(.json)' '$1$2'

如果满意,请删除-n(试运行)。

ablezmv autoload函数有两个参数:

  1. zsh 扩展的 glob 模式
  2. 更换规格

它找到与模式匹配的文件,这里是当前目录中按顺序包含的所有非隐藏文件:

  • *任意数量的字符(或字节)
  • \[字面意思[
  • *任意数量的字符(或字节)
  • .字面意思.
  • <->任何 ASCII 十进制数字序列(<x-y>匹配表示从 x 到 y 的数字的 ASCII 十进制数字序列)
  • \]\[][字面上地。
  • *任意数量的字符(或字节)
  • .json: 字面上地。

在替换中,$1扩展为第一对 中匹配的内容,因此和与第二对 ( )(...)相匹配。<->$2.json

请注意,当这些匹配贪婪时,它将在最右边的一对内容中找到以(不包括最后一个)结尾*的数字。例如,在 中,即使它不在 s 的倒数第二对中,它也会提取。[...].<digits>[a.1][a.2.3][x][y][z].json3[...]

如果这是一个问题,你可以将其更改为:

zmv -n '*.(<->)\]\[[^][]#\](.json)' '$1$2'

其中匹配除和[^][]#之外的 0 个或多个字符(或非字符)。[]

相关内容