我有大量文件,其文件名类似于:
myvideo.s01e01.episode.title.here.mp4
myvideo.s01e02.episode.title.here.mp4
我想批量重命名它们,所以我最终得到:
myvideo.s01e01.mp4
myvideo.s01e02.mp4
etc.
我使用的是 macOS,但文件位于网络共享上,因此也可以通过 Linux 进行寻址。
答案1
和zsh
:
autoload zmv
zmv -n '(*.s<->e<->).*(.mp4)' '$1$2'
高兴时删除-n
(试运行)。
答案2
如果您有权访问perl-rename
(rename
在某些 Linux 发行版、prename
其他发行版和perl-rename
其他发行版中称为),您可以执行以下操作:
$ rename -n 's/(.+?\..+?\.).*\.(.*)/$1$2/s' *mp4
myvideo.s01e01.episode.title.here.mp4 -> myvideo.s01e01.mp4
myvideo.s01e02.episode.title.here.mp4 -> myvideo.s01e02.mp4
这只会打印命令将执行的操作,而无需实际重命名任何内容。如果输出符合您的预期,则运行该命令而不-n
实际重命名文件。
如果你没有perl-rename
并且文件名不包含换行符并且所有字节都构成用户区域设置中的有效字符,你也可以直接在 shell 中执行此操作(这里假设一个zsh
-like shell 和一个 BSD-兼容的sed
实现):
for f in *mp4; do
newName=$(sed -E 's/(([^.]*\.){2}).*\.([^.]*)$/\1\3/' <<<"$f");
echo mv -- "$f" "$newName";
done
如果看起来正确,请再次运行而不使用echo
.