我有一个文件夹,其中包含许多以相同结构命名的文件:
file.number1.2010.720p.otherinfo.mp4
file.number2.1990.720p.otherinfo.mp4
....
我想删除所有序列:
YEAR.720p.otherinfo
因此名称将是:
file.number1.mp4
file.number2.mp4
....
最后,我想删除除末尾的点(.)(.mp4)之外的所有点(.)
我应该使用什么命令来创建这样的脚本?
答案1
这将完成这项工作:
首先:rename
通过在终端中运行以下命令进行安装:
sudo apt install rename
第二:在终端中,cd
进入包含文件的目录。
最后:通过在终端中运行以下命令将文件重命名为所需的格式:
rename 's/^(.+)\.(.+)\.(.+)\.(.+)\.(.+)\.mp4$/$1$2.mp4/' *
完毕
注意:
要查看rename
命令如何操作文件但不真正重命名它们(仅将输出打印到终端),您可以-n
在其后添加选项。像这样:
rename -n 's/^(.+)\.(.+)\.(.+)\.(.+)\.(.+)\.mp4$/$1$2.mp4/' *
解释 - 根据要求哈姆扎:
第1部分:
's/ORIGINAL/NEW/'
ORIGINAL
用字符串替换NEW
字符串。
要了解它的工作原理,非常简单:
- 请在终端中运行
rename -n 's/file.number1.2010.720p.otherinfo.mp4/NEW.mp4/' *
file.number1.2010.720p.otherinfo.mp4
假设当前目录中有一个名为的文件。- 输出将是
rename(file.number1.2010.720p.otherinfo.mp4, NEW.mp4)
第2部分:
^(.+)\.(.+)\.(.+)\.(.+)\.(.+)\.mp4$
从字符串的开头开始,然后匹配点之前的^
一个或多个字符(任意字符)(.+)
\.
将该组放入一个变量$1
并重复四次(总共五次),将每组放入一个变量($2
,,,)$3
,直到达到表示。$4
$5
.mp4
\.mp4
确保字符串.mp4
以使用与$
字符串末尾匹配的符号结尾。
但是,这部分有点灵活,如果文件命名不一致,并且文件名称中包含超过五个由点分隔的部分,则会产生不理想的结果,例如file.number1.2010.720p.otherinfo.extrainfo.mp4
如果是这种情况,请用下面更严格的正则表达式替换此部分。这样它只会对名称中由点分隔的五个部分的文件进行操作:
^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)\.mp4$
第 3 部分:
$1$2.mp4
将新文件名定义为第一个组的变量下的内容$1
(在本例中file
)+第二个组的变量下的内容$2
(在本例中number(x)
)+.mp4
第 4 部分:
*
对当前目录中的所有文件进行操作。
答案2
第一种方法:仅限cut
:
for I in .*mp4
do
echo mv "$I" "$(echo $I | cut -d. -f 1,2,6)"
done
解释:
for...
将选择所有.mp4
文件echo $I |
将I
变量转换为下一个程序的输入cut -d. -f 1,2,6
将选择字段 1、2 和 6,其中字段由.
但是这种方法可能有问题,因为第 6 个字段可能不是扩展。
所以你可以有第二种方法:
for I in .*mp4
do
echo mv "$I" "$(echo $I | cut -d. -f 1,2).mp4"
done
使用该命令,您可以强制将扩展名设为.mp4
。它可以工作,但是如果您拥有的文件不仅仅mp4
具有相同的命名模式怎么办?
在这种情况下,您可以使用扩展选择:
for I in *mp4 *avi
do
echo mv "$I" "$(echo $I | cut -d. -f 1,2).${I##*.}"
done
${I##*.}
将允许您选择最后一个.
变量后面的内容I
注意:为了防止不良行为,我添加了echo
命令以查看它们在实际运行之前会做什么。
答案3
答案4
我总是使用 Thunar(文件管理器)来实现这一点,只需打开它,选择要更改的文件(剪切/粘贴/调整/替换字符),然后右键单击->重命名
您将获得一个精致的菜单,其中有很多选项和方法来更改文件名及其扩展名,并在右侧面板中查看它们的预览。