2016-04-25 125 views
2

我试图重新命名为模拟器超过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 

所以现在我被困在如何去除惊叹号, 我花了很多时间试图寻找答案,但havnt有很多运气。 我也被困在我如何去除这些代码thingys“[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 

感谢,焾

+3

试试这个:'sed's/[!] * \ | \ [[^]] * \] \ | *(日本)* \ | *(美国)* // g'' – sat

+0

@sat:请将其添加为答案。 – blackSmith

+0

我试过使用该命令,但它似乎挂起,什么都不做:( – NeMesiS

回答

1

您可以使用一行替代多个模式sed,并且应该像空格和方括号一样摆脱特殊的字符:

#!/bin/bash 

for i in *.mp4 
do 
    mv "$i" "$(echo $i | sed 's/!!!//; s/\ (USA)\ //; s/\ (Japan)\ //; s/\[SLUS-[^][]*\]//')" 
done 
+1

但是我该如何使用它,所以它改变了文件名? 它似乎并没有自己做...谢谢 – NeMesiS

+0

@NeMesiS是的,它确实改变了文件名,注意'sed'调用在命令替换'$()'里面,它产生了'mv'命令的第二个文件名参数 – cmaster

+0

@Kadir:我不会使用'。*'在一个应该去掉大括号/括号的术语中,当你有像'[foo] bar [baz]'这样的文件名时,它会做坏事,除去括号内的表达式,我总是使用一个字符类''[^] [] *'在这些情况下。 – cmaster

0

可以使用rename命令为。它支持正则表达式。因此,该命令将类似于:

rename 's/[![]]//g' * 

rename 's/[!]*\|\[[^]]*\]\| *(Japan) *\| *(USA) *//g' * 

虽然在你的系统中可用rename请仔细检查手册页。例如。基于deb和基于rpm的分发版使用不同的版本,正则表达式将根据您的本地重命名版本而有所不同。

正则表达式应根据您的完整需求进行调整,因为从问题上看不太清楚。

它也可以节省文件名中的特殊符号可能存在​​的问题,如\n等。

+0

真棒,谢谢大家非常感谢... – NeMesiS

+0

请注意'rename' ma y是许多在Linux机器上显示的工具中的任何一种,并且可能不存在于非Linux系统上。所以它不是可移植的,即使在语言间也是如此。由于该问题没有指定特定的平台(可能是Linux,OSX,FreeBSD,Solaris,AIX等),因此最好让您的答案可移植。 – ghoti

0

删除! :

for i in *.mp4 
do 
    name=`echo $i | sed 's/!//g'` 
    mv "$i" "$name" 
done 

Eemove的[???]:

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 
+0

正如我已经评论过卡迪尔的回答:如果你想删除括号内的术语,使用'。*'不是一个好主意。使用一个字符类而不是'.'运算符,或者准备好你的正则表达式做一些你不想要的东西。 – cmaster

+0

@cmaster你是指[A-Za-z_0-9] *之类的东西吗? – Fabich

+0

更多类似'[^] [] *'。当然,越严格,越不可能移除你不想要的东西。但是,越严格,越不可能移除你想要的东西。所以我不会说'[^] [] *'或'[A-Za-z_0-9]'中的一个比另一个好。重要的部分是排除您匹配的分隔符。 – cmaster

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 

一旦你验证mv命令是正确的您可以删除echo