将前两个句点重命名为连字符

将前两个句点重命名为连字符

我有以下命令可以递归地将文件名中的句点更改为连字符,只要它们之前和之后都有另一个句点:

find path/to/dir -depth -type f -name '*.*' -exec rename -n -d 's/(?<=.)\.(?=.*\.)/-/g' {} +

然而它不能有效地用于我想要调整的所有文件名,并且需要根据以下规则重写:

  1. 重命名仅发生在以数字开头的文件名上。
  2. 隐藏文件不会被更改。
  3. 仅每个文件名中的前两个句点发生更改。

例如:2020.12.06_name123.ext.xmp变为2020-12-06_name123.ext.xmpname123.ext.xmp保持不变。

怎么解决?

运行 linux mint cinnamon 21

答案1

也许你可以使用zsh并执行以下操作:

autoload -Uz zmv
zmv -n '(**/)(<1900-2100>).(<1-12>).(<1-31>)([^0-9]*)(#q.)' '$1$2-$3-$4$5'

明确要匹配的内容(此处文件名以给定范围内的 YYYY.MM.DD 日期开头)。

-n用于空运行。将其删除以实际执行)。


1 从技术上讲,这也将匹配002023.1.012<x-y>即表示 之间的数字的任何十进制数字序列的匹配Xy

答案2

下面是一个示例awk,假设名称以数字开头,点的位置是固定的,日期和其余部分之间的分隔符是下划线:

awk -F_ 'BEGIN {OFS="_"} /^[0-9]/ {a=gensub(".","-",5,$1);b=gensub(".","-",8,a);$1=b }1'

这是全文find

find  -depth -type f -name '*.*" -exec  awk -F_ 'BEGIN {OFS="_"} /^[0-9]/ {a=gensub(".","-",5,$1);b=gensub(".","-",8,a);$1=b }1' {} +

相关内容