我正在寻找一种方法重命名一批视频删除文本之间的两点。具体来说,我想删除第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
我试着用苹果的自动服务来做这件事。右键单击一堆文件并选择服务来清理名称.我找到了一段代码,但不确定我是否正确地使用了它。
for f in "$@"
do
echo sed -e 's/\(--LabelMe).*\(LabelMe--)/\1\2/'
done
发布于 2018-02-09 09:20:32
在这个站点上,有很多关于用这样的shell循环来重命名文件的问题,还有一些关于使用sed来重命名文件的问题。(例如这、这)
您需要使用管道将文件名传递给sed,并使用命令替换来捕获结果,如下所示:
mv "$f" "$(echo "$f" | sed -e '...' )"您使用的sed命令需要进行一些修正:首先,您引用了开头的括号,但没有引用结束的括号,因此分组无法工作。另外,我不知道为什么要将LabelMe片段放回文件名。如果要删除它们,只需跳过分组和\N引用:
's/--LabelMe.*LabelMe--//'因此,全文如下:
for f in "$@"
do
mv "$f" "$(echo "$f" | sed -e 's/--LabelMe.*LabelMe--//' )"
done另一种方法是使用shell的参数替换来进行同样的操作。替代${par/pattern/replacement}是非标准的,但在许多shell中支持:
for f in "$@"
do
mv "$f" "${f/--LabelMe*LabelMe--/}"
done(注意,这不是正则表达式,所以“任何”的语法只是*,而不是.*)
发布于 2018-02-08 23:16:58
使用(perl)重命名。我不知道苹果的情况,但Linux发行版大多带有两个版本的重命名。Perl重命名是功能更强大的名称。
首先,使用-n标志运行该命令,该标志执行“试运行”,不做任何更改。
$ 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--。https://unix.stackexchange.com/questions/422927
复制相似问题