我需要使用 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
答案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 文件名通配模式,因此点在任何方面都不特殊。