答案1
使用 bash 的内置子字符串扩展:
for f in 2015* ; do
mv "$f" "${f::4}-${f:4:2}-${f:6}"
done
答案2
和sed
:
LC_ALL=C sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1_\2_\3/' <file
答案3
尽管rename
它是一个非常强大的工具,但我通常更喜欢它的简单性mmv
(多次移动)实用程序:
mmv '????????_*' '#1#2#3#4-#5#6-#7#8_#9'
搜索模式中的?
代表单个字符,*
代表任意长的字符序列。在替换模式中,every#<number>
代表搜索模式中对应的?
or 。*
除了 和 之外?
,*
还mmv
支持括号内的字符范围(如[a-f]
)。
(mmv
将在开始工作之前测试重命名中的任何冲突,这样您就不会因为覆盖而丢失文件。)
答案4
在我的发行版上,我有一个perl-rename
命令,它可以使用 perl 样式的正则表达式来批量重命名文件。该rename
命令仅接受一对固定字符串进行重命名。