2014-09-24 68 views
0

我有一個具有以下格式的許多文件:刪除文本 -

misty mountains - final chapter-84jdodljdjlm.mp3 
misty mountains - first chanpt-4jd0843l8.mp3 
misty mountains - (final chapter) - fj084j4.mp3 

我想第一-之前的所有文字和第二-之前的所有文本。我如何從文件名中提取這些文本?還是更願意到第二-後抹去的東西,前.mp3

+0

Befire第一和之前第二:'(([^ - ] *) - [^ - ] *)' – sln 2014-09-24 16:13:27

+0

什麼做你想做的事用簡化的名字,用它來重命名現有文件?如果這是你的意圖,你的問題應該這樣說。你是否需要幫助編寫代碼來處理一組文件並重命名它們?如果是,請在你的問題中說出來。祝你好運。 – shellter 2014-09-24 16:14:04

+0

是的,我希望重新命名文件。我發現如果我一次要求太多,我的問題可能會混淆,所以我只是要求提供我真正需要的部分。但是,你是正確的我想批量重命名文件夾中的文件使用osx – muraenok 2014-09-24 16:43:51

回答

1

使用bash參數擴展

你可以使用bash的內置參數擴展到從shell glob剝去文件名的部分。例如

for file in *mp3; do 
    echo "${file%-*}" 
done 

如果您要重命名的文件,而不是僅僅捕獲或打印修改文件名,然後代替回聲你可能你的循環更改爲類似:

for file in *mp3; do 
    mv "$file" "${file%-*}.mp3" 
done 

測試的解決方案

測試代碼

您可以測試這個提前出局看到的結果將是什麼樣子。例如:

files=(
    'misty mountains - final chapter-84jdodljdjlm.mp3' 
    'misty mountains - first chanpt-4jd0843l8.mp3' 
    'misty mountains - (final chapter) - fj084j4.mp3' 
) 
for file in "${files[@]}"; do echo "${file%-*}"; done 

測試輸出

misty mountains - final chapter 
misty mountains - first chanpt 
misty mountains - (final chapter) 
+0

謝謝。驚人的技巧。起初我沒有正確地提出問題,謝謝你幫助我看到更好的方式去做事情。我會查找這個竅門。 – muraenok 2014-09-24 17:16:34

1

這AWK的一行可以幫助你:

awk -F- '{print $1,$2}' 

測試你的短信:

kent$ echo "misty mountains - final chapter-84jdodljdjlm.mp3 
misty mountains - first chanpt-4jd0843l8.mp3 
misty mountains - (final chapter) - fj084j4.mp3"|awk -F- '{print $1,$2}' 
misty mountains final chapter 
misty mountains first chanpt 
misty mountains (final chapter) 

列出所有的文件,你可以嘗試ls -1 *.mp3|awk ...

解決方案不是一般的解決方案,但我想它會是最好的滿足您的要求。