我有一個具有以下格式的許多文件:刪除文本 -
misty mountains - final chapter-84jdodljdjlm.mp3
misty mountains - first chanpt-4jd0843l8.mp3
misty mountains - (final chapter) - fj084j4.mp3
我想第一-
之前的所有文字和第二-
之前的所有文本。我如何從文件名中提取這些文本?還是更願意到第二-
後抹去的東西,前.mp3
我有一個具有以下格式的許多文件:刪除文本 -
misty mountains - final chapter-84jdodljdjlm.mp3
misty mountains - first chanpt-4jd0843l8.mp3
misty mountains - (final chapter) - fj084j4.mp3
我想第一-
之前的所有文字和第二-
之前的所有文本。我如何從文件名中提取這些文本?還是更願意到第二-
後抹去的東西,前.mp3
你可以使用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)
謝謝。驚人的技巧。起初我沒有正確地提出問題,謝謝你幫助我看到更好的方式去做事情。我會查找這個竅門。 – muraenok 2014-09-24 17:16:34
這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 ...
解決方案不是一般的解決方案,但我想它會是最好的滿足您的要求。
Befire第一和之前第二:'(([^ - ] *) - [^ - ] *)' – sln 2014-09-24 16:13:27
什麼做你想做的事用簡化的名字,用它來重命名現有文件?如果這是你的意圖,你的問題應該這樣說。你是否需要幫助編寫代碼來處理一組文件並重命名它們?如果是,請在你的問題中說出來。祝你好運。 – shellter 2014-09-24 16:14:04
是的,我希望重新命名文件。我發現如果我一次要求太多,我的問題可能會混淆,所以我只是要求提供我真正需要的部分。但是,你是正確的我想批量重命名文件夾中的文件使用osx – muraenok 2014-09-24 16:43:51