用 zmv 批量重命名文件
source link: https://lenciel.com/2022/10/renaming-with-zmv/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
我看电影主要靠下载1。
这些年,好的电影网站越来越少:因为版权管得严了,似乎没啥好抱怨的。
还在经营的,很多都会在压片子的时候,加点儿自己的广告,顺道改改文件名:都要吃饭嘛,似乎也没啥好抱怨的。
但我每次要去看电影的时候,无论电脑还是投影仪,就经常陷入下图所示的「我究竟下了些什么」的迷茫中:
因为我用 zsh,所以就拿它自带的 zmv 来解决这个问题。
加载zmv
首先你需要加载这个命令:
$ which zmv
zmv not found
$ autoload -Uz zmv
$ which zmv
zmv () {
# undefined
builtin autoload -X
}
这里的 undefined
看起来可能有点吓人,但其实在 zsh 的 autoloading functions 里这是很常见的 annotation。
如果你想让它常驻可以:
$ vi $HOME/.zshenv
autoload zmv
zmv 的基础语法是:
zmv 'input_pattern' 'output_pattern'
举个例子,处理照片的时候我们经常要遍历整个目录和子目录,把所有的 JPEG
后缀的文件改成 jpeg
。用 zmv 你只需要2:
$ zmv -n -W '**/*.JPEG' '**/*.jpeg'
而如果是生写 bash 你大概需要:
$ for file in **/*.JPEG; do mv $file ${file/.JPEG/.jpeg}; done;
pattern/group
要解决我遇到的问题,当然可以使用粗暴点儿的办法,比如去掉开头的 8 个字符:
$ zmv -n '*' '$f[9,-1]'
但实际上,zmv 真正强大在于它支持匹配和分组:需要注意的是,虽然声明 group 也是用括号,但它用的不是正则而是glob。
比如你想去掉文件里面所有的[]
起来的前缀,可以写成:
$ zmv -n '\[*\](*).(mkv|mp4)' '$1.$2'
mv -- '[电影天堂www.dytt89.com]灰影人-2022_蓝光中英双字.mp4' 灰影人-2022_蓝光中英双字.mp4
mv -- '[电影天堂www.dytt89.com]狩猎-2022_BD韩语中字.mp4' 狩猎-2022_BD韩语中字.mp4
这里的意思是,用[]
扩起来的任何字符后面跟的如果是.mkv
或者.mp4
后缀,则把文件名作为第一个分组,把后缀作为第二个分组,用 $1.$2
引用这两个分组来生成修改后的文件名。
更多 zmv 的用法可以看它的文档。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK