2015-06-02 21 views
-2

我有形式在bash修剪名與內置工具只(不重命名命令)

word-123_AnotherWord--asdf_12345.mp4 
word-123_AnotherWord-_asdf-12345.mp4 
word-123_AnotherWord-asdf--12345.mp4 
word-123_AnotherWord-asdf_-12345.mp4 

的文件名...我希望削減到只包含最後的11個字符和擴展。


我現在嘗試這樣做,如下所示:

$ for i in *.mp4 ; do 
     mv "$i" "${/.*?(.{1,11}\.mp4)$/}"; 
done 

但我給了我這個錯誤:

bash: ${/.*?(.{1,11}.mp4)$/}: bad substitution

任何想法,爲什麼?

這個問題是繼續這stack,但回答那裏工作在我的電腦本地只,我沒有在我的服務器遠程工作!

在此先感謝!

+0

你究竟想要代碼做什麼? –

+1

......也就是說:知道bash爲什麼會失敗的人是顯而易見的。如何改變工作方式並不明顯,因爲你的意圖不清楚。 –

+1

但改名如何?給出一個輸入名稱和一個輸出名稱的例子。 –

回答

2

在語法${var/pattern/replacement},有幾件事情錯的用法"${/.*?(.{1,11}\.mp4)$/}"

  • 首先,var不是可選的,它是強制性的。
  • 其次,pattern需要以glob格式給出,而不是正則表達式格式。如果您想要更有趣的表情,請使用extglob syntax
  • 第三,除非意圖是刪除與表達式匹配的部分,否則最終的/實際上應該包含某些內容。

如果要修剪一切,但每名(11 + 4的擴展名)的最後15個字符,這是微不足道的:

for i in *.mp4; do 
    mv "$i" "${i:${#i}-15}" 
done 

現在,如果你真的想用一個正則表達式:

name_re='.{1,11}\.mp4$' 
for i in *.mp4; do 
    [[ $i =~ $name_re ]] && mv -- "$i" "${BASH_REMATCH[0]}" 
done 
+0

>最後的'/'實際上應該包含一些東西。 請您澄清一點嗎?像我的情況的例子? – Homer

+0

@SomeOne,因爲你想要做的不是實際的替換,「$ {var/pattern/replacement}」根本就不是正確的值。然而,'$ {var/pattern /}'只是在模式發生時才刪除模式,因爲它將其替換爲空,而不是隔離模式。因此,如果將正則表達式更新爲有效的shell模式,那麼即使此代碼會執行錯誤的操作,因爲它將刪除匹配項並將該文件重命名爲刪除後留下的內容,而不是將該文件重命名爲比賽。 –