ファイル名から特定の部分文字列を抽出する

ファイル名から特定の部分文字列を抽出する

私が解決する必要があるのは、ディレクトリ内の各ファイル名から特定の部分文字列を抽出することです。

ファイル名の例:

ボブ・マリ -保安官を撃った -2XiYUYcpsT4.mp3
Audioslave -あなた自身になる -WC5FdFLUcl0.mp3
ブルーノマス - 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の後にダッシュがない場合は、単純なパラメータ拡張を使用できます。値の終わりと先頭から%パターンを削除します。#シンボルを2倍に増やすと「貪欲的」になります。つまり、できるだけ多くのコンテンツが削除されます。

#! /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

関連情報