我有以下命令可以递归地将文件名中的句点更改为连字符,只要它们之前和之后都有另一个句点:
find path/to/dir -depth -type f -name '*.*' -exec rename -n -d 's/(?<=.)\.(?=.*\.)/-/g' {} +
然而它不能有效地用于我想要调整的所有文件名,并且需要根据以下规则重写:
- 重命名仅发生在以数字开头的文件名上。
- 隐藏文件不会被更改。
- 仅每个文件名中的前两个句点发生更改。
例如:2020.12.06_name123.ext.xmp
变为2020-12-06_name123.ext.xmp
而name123.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>
即表示 之间的数字的任何十进制数字序列的匹配X和y。
答案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' {} +