2016-04-25 115 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