2012-09-25 48 views
2

解決方案:提取subtring,在模式分裂,在bash腳本使用sed的

#!/bin/bash 
for f in *.mp3; do 
    d="${f% - *}" 
    if [ -d $d ]; then 
     mv "$f" "$d/"; 
    else 
     mkdir "$d" && mv "$f" "$d/"; 
    fi 
done 

我想這一點:

$ echo "foo - bar.ext" | sed 's/\('" - "'\).*/\1/' | sed 's/ - //' 

這使我只是 「富」。我想有更好的辦法...不要打我很難,我是新來的sed。但現在,如何將它包含在這樣的循環:提前

#!/bin/bash 
for f in *.ext; do 
    d="${f%.*}" 
    #Extract Filename String before the " - " and write back to $d 
    mkdir "$d" && mv "$f" "$d/"; 
done 

感謝

更多信息:

$ F將保持不變,而一個目錄名,存放在$ d應只包含「foo」 - 匹配「foo - bar.ext」的模式的一部分。

基本上,模式「foo - bar.ext」後面的文件列表應移動到名爲「foo」的目錄中。

例如: foo1 - bar1.ext foo1 - bar2.ext foo1 - bar2.ext - >將被移動到子目錄 「foo1」

anotherfoo - anotherbar.ext - >將被移動到subdir「anotherfoo」

+1

鑑於您的「foo - bar.ext」輸入,請編輯您的Q以包含$ d和$ f的預期最終值。祝你好運。 – shellter

+0

完成,希望現在更清楚:-) –

+0

+1爲好初學者S.O.題。只要記住包括示例輸入,一些必需的輸出,您嘗試過的代碼以及您得到的錯誤消息,並且您將在此處獲得非常快速的幫助。閱讀http://stackoverflow.com/faq以真正加快速度。祝你好運。 – shellter

回答

1

你幾乎已經擁有它了。代碼片段中只有三個字符丟失。

#!/bin/bash 
for f in *.ext; do 
    d="${f% - *}" 
    mkdir "$d" && mv "$f" "$d/"; 
done 
+0

哇,就是這樣?我一直在檢查sed ..謝謝你,完美地工作。 –

+0

如果您有解決方案可以使用,請接受答案。 (點擊接受標誌) – jm666