首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在两点之间重命名文件名

在两点之间重命名文件名
EN

Unix & Linux用户
提问于 2018-02-08 23:09:20
回答 2查看 192关注 0票数 0

我正在寻找一种方法重命名一批视频删除文本之间的两点。具体来说,我想删除第6个字符之后的所有内容,到最后一个"LabelMe--“。

0001--LabelMe--A005_01241110_C001--LabelMe-- --Interview--Man in library.mov

0002--LabelMe--A005_01241110_C002--LabelMe-- --Broll--Man looking at books.mov

0003--LabelMe--A005_01241111_C003--LabelMe-- --Broll--messed up--LabelMe-- --Broll--Sitting at table.mov

我试着用苹果的自动服务来做这件事。右键单击一堆文件并选择服务来清理名称.我找到了一段代码,但不确定我是否正确地使用了它。

代码语言:javascript
复制
for f in "$@"
do 
    echo sed -e 's/\(--LabelMe).*\(LabelMe--)/\1\2/'
done
EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-02-09 09:20:32

在这个站点上,有很多关于用这样的shell循环来重命名文件的问题,还有一些关于使用sed来重命名文件的问题。(例如)

您需要使用管道将文件名传递给sed,并使用命令替换来捕获结果,如下所示:

代码语言:javascript
复制
mv "$f" "$(echo "$f" | sed -e '...' )"

您使用的sed命令需要进行一些修正:首先,您引用了开头的括号,但没有引用结束的括号,因此分组无法工作。另外,我不知道为什么要将LabelMe片段放回文件名。如果要删除它们,只需跳过分组和\N引用:

代码语言:javascript
复制
's/--LabelMe.*LabelMe--//'

因此,全文如下:

代码语言:javascript
复制
for f in "$@"
do 
    mv "$f" "$(echo "$f" | sed -e 's/--LabelMe.*LabelMe--//' )"
done

另一种方法是使用shell的参数替换来进行同样的操作。替代${par/pattern/replacement}是非标准的,但在许多shell中支持:

代码语言:javascript
复制
for f in "$@"
do 
    mv "$f" "${f/--LabelMe*LabelMe--/}"
done

(注意,这不是正则表达式,所以“任何”的语法只是*,而不是.*)

票数 0
EN

Unix & Linux用户

发布于 2018-02-08 23:16:58

使用(perl)重命名。我不知道苹果的情况,但Linux发行版大多带有两个版本的重命名。Perl重命名是功能更强大的名称。

首先,使用-n标志运行该命令,该标志执行“试运行”,不做任何更改。

代码语言:javascript
复制
$ rename 's/(.{6}).*LabelMe--/$1/' 000* -n
0001--LabelMe--A005_01241110_C001--LabelMe-- --Interview--Man in library.mov -> 1110_C --Interview--Man in library.mov
0002--LabelMe--A005_01241110_C002--LabelMe-- --Broll--Man looking at books.mov -> 1110_C --Broll--Man looking at books.mov
0003--LabelMe--A005_01241111_C003--LabelMe-- --Broll--messed up--LabelMe-- --Broll--Sitting at table.mov -> messed --Broll--Sitting at table.mov

一旦您对结果感到满意,就实际运行它,即rename 's/(.{6}).*LabelMe--/$1/' 000*

解释

  • rename 's/foo/bar/' 000*:此格式将搜索foo正则表达式,并将其替换为bar。它将操作所有与glob 000*匹配的文件。
  • (.{6}).*LabelMe--:这是您正在寻找的正则表达式。您正在寻找任何字符.{6}中的6个,您将其放入捕获组(.{6})中。在此之后,您可以在找到.*之前拥有任何字符LabelMe--
  • $1:这就是您要用什么替换上面的字符串。$1是指上面的匹配组(.{6})的内容。其余部分将不会被替换,即删除前六个字符之后的所有内容,直到并包括LabelMe--
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/422927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档