我有一个具有以下格式的许多文件:删除文本 -
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