2014-09-24 76 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 ...

解决方案不是一般的解决方案,但我想它会是最好的满足您的要求。