删除“!” ,“[”和“]”来自文件名

时间:2016-04-25 12:02:32

标签: bash unix

我正在尝试为我正在整理的模拟器重命名超过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

4 个答案:

答案 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