从文件名中提取特定子字符串

从文件名中提取特定子字符串

我需要解决的任务是从目录中的每个文件名中提取特定的子字符串。

文件名示例:

鲍勃·马利 - 我射杀了警长 -2XiYUYcpsT4.mp3
Audioslave - 做你自己-WC5FdFLUcl0.mp3
Bruno Mars - Treasure [官方音乐视频]-nPvuNsRccVw.mp3

基本上,它是我从 youtube 获取的音乐集合,我需要提取视频 ID(粗体部分)。我怎样才能在bash中解决这个问题?基于定界符的分割并不可靠,因为视频 ID 有时包含连字符本身。

答案1

你可以使用子串扩展:

for file in ./*.mp3
do
videoid=${file:${#file}-15:11}
printf %s\\n $videoid
done

或者,如果有多个扩展名,请使用

noext=${file%.*}
videoid=${noext:${#noext}-11:11}

这假设YouTube 视频 ID 始终为 11 个字符

答案2

如果 id 之前始终有破折号,并且 id 后面没有破折号,则可以使用简单的参数扩展。从值的末尾和开头%删除模式。#将符号加倍会使其变得“贪婪” - 它会删除尽可能多的内容。

#! /bin/bash

files=( 'Bob Marley - I Shot The Sheriff-2XiYUYcpsT4.mp3'
        'Audioslave - Be Yourself-WC5FdFlUcl0.mp3'
        'Bruno Mars - Treasure [Official Music Video]-nPvuNsRccVw.mp3'
      )

for file in "${files[@]}" ; do
    id=${file##*-}
    id=${id%.mp3}
    echo "$id"
done

相关内容