使用sed重命名多个文件

4

我该如何将类似于Stargate SG-1 Season 01 Episode 01这样的文件名称重命名为"s01e01"呢?当然,编号是可变的。我已经有了以下代码:

for file in *.mkv; do mv "$file" "$(echo "$file" | sed -e "REGEX HERE")

我只需要适合我需求的sed命令即可。

谢谢


请参考相关问题https://dev59.com/HGkv5IYBdhLWcg3wqSf1。 - Mihai8
@user1929959,那个问题是关于更改多个文件的内容,而这个问题则是询问如何重命名多个文件。 - doubleDown
4个回答

9
不需要使用sed,尝试这个方法:
#!/bin/bash

for f in *.mkv;
do
    set -- $f
    mv "$f" s${4}e${6}
done

实际应用:

$ ls
Stargate SG-1 Season 01 Episode 01.mkv

$ ./l.sh 

$ ls
s01e01.mkv

1
他要求使用 sed。你怎么知道他不需要 sed?这个例子可能只是一个特例,他可能还有很多其他需要使用 sed 的情况。此外,你的回答依赖于 bash,他可能正在使用另一个 shell。 - fiatjaf
好的,OP接受了答案,所以我猜问题已经解决了。如果你认为你有更好的解决方案,就发表出来看看会发生什么 :-) - Fredrik Pihl
2
作为楼主并不意味着他是真相的最终仲裁者,被采纳的答案也不意味着它是好的,事实上它甚至不一定是一个答案。 - fiatjaf

4

GNU sed

for file in *.mkv; do mv "$file" "$(echo "$file" | sed -e 's/.*\(\S\+\)\s\+\S\+\s\(\S\+\)$/s\1e\2/')

2
Awk也很适合这个任务。
for file in *.mkv; do
   mv "$file" $(awk '{print "s", $4, "e", $6}' <<<$file).mkv
done

我认为对于sed来说这不是问题 :)


0

如果我要重命名所有的 *.mkv 文件,我会这样做:

ls *.mkv | awk '{print "mv \"" $0 "\" s" $4 "e" $6}' | sh

或者

ls *.mkv | awk '{print "\"" $0 "\" s" $4 "e" $6}' | xargs mv


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接