我正在尝试为我正在整理的模拟器重命名超过1700个视频,
某些文件可能如下所示:
romfilename1!!! (Japan) [SLUS-01005].mp4
romfilename2 (USA) [SLUS-28605] (Disc 1).mp4
romfilename3 (USA) [SLUS-28605] (Disc 2).mp4
我正在努力实现以下结果:
romfilename1.mp4
romfilename2 (Disc 1).mp4
romfilename3 (Disc 2).mp4
到目前为止,我已经能够删除(USA)& (日本)使用:
for i in *.mp4
do
mv "$i" "`echo $i | sed 's/ (USA)//'`"
done
所以现在我被困在如何去除感叹号上, 我花了很多时间试图寻找答案但是却有很多运气。 我也被困在我如何删除这些代码东西“[SLUS-28605]” 主要是因为括号“[”和“]”,内部代码并不重要。 我已经完成了以下内容,但是这些特殊的角色搞得一团糟。
for i in *.mp4
do
mv "$i" "`echo $i | sed 's/!!//'`"
done
和...
for i in *.mp4
do
mv "$i" "`echo $i | sed 's/[SLUS-28605]//'`"
done
和..
for i in *.mp4
do
mv "$i" "`echo $i | sed -i 's/[]"[]//g'
done
提前感谢任何帮助,Nem
答案 0 :(得分:3)
您不需要sed
。
shopt -s extglob
for i in *.mp4
do
# Remove all !; the ! doesn't need to be escaped if history
# expansion is disabled.
new_i=${i//\!}
# Remove the *first* parenthesized group (which contains the country)
new_i=${new_i/ (+([!)]))}
# Remove the bracketed group
new_i=${new_i// \[*]}
#mv "$i" "$new_i"
echo "mv \"$i\" \"$new_i\""
done
验证echo
命令是否正确后,您可以删除mv
。
答案 1 :(得分:1)
您可以使用 sed 在一行中替换多个模式,并且应该转换空格和方括号等特殊字符:
#!/bin/bash
for i in *.mp4
do
mv "$i" "$(echo $i | sed 's/!!!//; s/\ (USA)\ //; s/\ (Japan)\ //; s/\[SLUS-[^][]*\]//')"
done
答案 2 :(得分:0)
您可以使用rename
命令。它支持正则表达式。所以命令看起来像:
rename 's/[![]]//g' *
或
rename 's/[!]*\|\[[^]]*\]\| *(Japan) *\| *(USA) *//g' *
虽然请仔细检查您系统中可用的rename
的手册页。例如。基于deb和基于rpm的分发版使用不同的版本,正则表达式将根据您的本地重命名版本而有所不同。
应该根据您的完整要求调整正则表达式,因为问题并不是很清楚。
它还可以避免文件名中包含特殊符号的问题,例如\n
和其他。
答案 3 :(得分:0)
删除! :
for i in *.mp4
do
name=`echo $i | sed 's/!//g'`
mv "$i" "$name"
done
Esoove [???]:
for i in *.mp4
do
name=`echo $i | sed 's/\[[^][]*\]//g'`
mv "$i" "$name"
done
删除(???):
for i in *.mp4
do
name=`echo $i | sed 's/([^)(]*)//g'`
mv "$i" "$name"
done
如果您想要一次删除所有内容:
for i in *.mp4
do
name=`echo $i | sed 's/!//g' | sed 's/([^)(]*)//g' | sed 's/\[[^][]*\]//g' `
mv "$i" "$name"
done