重命名名称中包含 2 个连续句点的多个文件

重命名名称中包含 2 个连续句点的多个文件

我需要使用 rename 命令重命名数百个文件名中包含 .. (2 个句点)的文件,并将 .. 更改为 - (连字符)。它包含句点的事实似乎使重命名命令感到困惑。

以下是一些文件名示例:

20180201_190000_TX_AJAX..HHE_instrument_0456 
20180201_190000_TX_AJAX..HHN_instrument_0456 
20180201_190000_TX_AJAX..HHZ_instrument_0456

我需要重命名这些文件以使其看起来链接:

20180201_190000_TX_AJAX-HHE_instrument_0456 
20180201_190000_TX_AJAX-HHN_instrument_0456 
20180201_190000_TX_AJAX-HHZ_instrument_0456

这个命令:

rename 's/../-/' *

结果是这些文件名:

-180201_190000_TX_AJAX..HHE_instrument_0456 -180201_190000_TX_AJAX..HHN_instrument_0456 -180201_190000_TX_AJAX..HHZ_instrument_0456

似乎周期有一些特殊的目的,所以它变得混乱。然后我尝试了这个:

rename 's/..H/-H/' *

示例中的 AJAX 代表一个站点,并且这些站点有所不同。上述语法有效并产生“20180201_190000_TX_AJAX-HHE_instrument_0456”,这对于许多电台来说是预期的,但对于其他电台来说却是意外的结果:

20180201_000000_SA.AKHBR..HNE_instrument_0542 renamed as 20180201_000000_SA.-HBR..HNE_instrument_0542

20180201_000000_SA.KSHB4..HHE_instrument_0935 renamed as 20180201_000000_SA.-HB4..HHE_instrument_0935

20180201_000000_SA.HTM01..HHE_instrument_0933 renamed as 20180201_000000_S-HTM01..HHE_instrument_0933

似乎任何包含字母 H 的电台都会感到困惑。

作为参考,AJAX 是一个站点代码,站点代码的长度为 4 或 5 个字符。

接下来我尝试了这个:

rename ‘s/SA.????..H/SA.????-H/ * -n 

但这会产生错误:

"Nested quantifiers in regex; marked by <-- HERE in m/SA.??? <-- HERE ?..H/ at (eval 1) line 1."

所以我猜它不喜欢通配符。

感谢您提供的任何帮助。

答案1

尝试这个 :

rename -n 's/\.\./-/' ./*

.中的, 方法任何字符,所以它匹配所有内容!

-n当您对测试满意时删除

答案2

点将匹配任何字符,因此双点匹配文件名中的前两个字符,这就是为什么这些字符被破折号替换为rename.将正则表达式中的每个点转义为\.或使用循环(这是为 编写的bash):

for name in ./*..*; do
    newname=${name/../-}
    printf 'Would move %s to %s\n' "$name" "$newname"
    # mv -i "$name" "$newname"
done

运行一次并确保它输出正确的内容,然后删除#并再次运行。

该循环将迭代当前目录中包含两个连续点的所有名称。参数${name/../-}替换将用破折号替换第一次出现的两个连续点。这是一个 shell 文件名通配模式,因此点在任何方面都不特殊。

相关内容