我该如何更换它
[www.Example.com]Name-episode-77.mp4
FGBs episode 3 dks.mp4
到
HxH 077.mp4
HxH 003.mp4
*文件名称不符合确切的模式
我想要 :-
- 删除所有字符和符号
- 格式化数字从 3 到 003
- 在文件名开头添加字符串
答案1
此单行代码适用于您的示例数据:
for i in *; do echo "$i";mv "$i" $(echo "$i" | perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"'); done;
解释:
for i in *;
do
echo "$i";
mv "$i" $(echo "$i" | perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"');
done;
for i in *;do
-> 循环遍历当前目录中的所有文件
echo "$i";
-> 写入当前文件(参见 progres/logging)
mv "$i" $(echo "$i" | perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"');
-> 重命名命令(原始名称到 perl 命令的输出) perl 命令从给定的文件名中提取数字并打印“HxH”、以 0 开头的数字和“.mp4”
重要的提示:
给出的命令适用于您提供的两个示例输入。在将其应用于实际文件之前,您一定要对其进行测试。因此,我建议mv "$i"
从命令中删除。然后您可以验证名称。
答案2
另一种可能性是使用rename
(perl 版本,这是 Ubuntu 附带的标准版本)和正则表达式(RE):
rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
一步步:
rename -vn
将会说出 (-v
) 将执行哪些重命名,但不执行它们 (-n
);对于每个名称,
s
用第二个字符串替换()第一个 RE,并用/
;分隔。第一个 RE 以非贪婪方式匹配零个或多个字符 (
.*?
),后跟一个或多个数字 ( ),后跟任意内容;由于括号 ( )[0-9]+
,数字匹配保存在第一组中;(...)
第二个字符串扩展为 perl 命令,
sprintf("HxH %03d", $1)
其中$1
是上面匹配的第一个组;e
命令的标志s
表示我想要执行替换表达式并使用结果,因此执行并在大小为 3 的字段中以前导零sprintf
打印中的数字( );$1
"%03d"
最后,将该命令应用于所有以( )
rename
结尾的文件。.mp4
*.mp4
看:
% ls
FGBs episode 3 dks.mp4 [www.Example.com]Name-episode-77.mp4
% rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
FGBs episode 3 dks.mp4 renamed as HxH 003.mp4
[www.Example.com]Name-episode-77.mp4 renamed as HxH 077.mp4
请注意,这只是一次测试运行;重命名无法撤消...现在让我们真正运行一下:
% rename -v 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
FGBs episode 3 dks.mp4 renamed as HxH 003.mp4
[www.Example.com]Name-episode-77.mp4 renamed as HxH 077.mp4
% ls
HxH 003.mp4 HxH 077.mp4
正则表达式确实很强大。
请注意,只会使用第一组数字:
% touch "Another serie 2 ep 34.mp4"
% rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
Another serie 2 ep 34.mp4 renamed as HxH 002.mp4
为了避免这种情况......例如研究https://stackoverflow.com/questions/5320525/regular-expression-to-match-last-number-in-a-string并注意“mp4”中的“4”......
此外,如果名称包含不数字---参见下面@kos 的评论。