This will mostly do what you want, you are asking for a lot though so let me know if there are any parts you are confused about and I will try to explain them:
#!/usr/bin/env bash
song_dir="$HOME/tmp/songs"
out_dir="$HOME/tmp/org_songs"
[[ ! -d "$out_dir" ]] && mkdir -p "$out_dir"
get_artist () {
local a=($(tr '_' ' ' <<<"$1"))
for i in "${a[@]}"; do
if [[ $i =~ artiste.* ]]; then
printf '%s\n' "${i#*=}"
break
fi
done
}
get_album () {
local a=($(tr '_' ' ' <<<"$1"))
for i in "${a[@]}"; do
if [[ $i =~ album.* ]]; then
printf '%s\n' "${i#*=}"
break
fi
done
}
get_song () {
local a=($(tr '_' ' ' <<<"$1"))
for i in "${a[@]}"; do
if [[ $i =~ song.* ]]; then
printf '%s\n' "${i#*=}"
break
fi
done
}
for song in "${song_dir}/"*.mp3; do
bname=$(basename "$song")
artist=$(get_artist "$bname")
album=$(get_album "$bname")
sname=$(get_song "$bname")
[[ ! -d "${out_dir}/${artist}/${album}" ]] && mkdir -p "${out_dir}/${artist}/${album}"
cp "$song" "${out_dir}/${artist}/${album}/${sname}"
done
In use:
Before:
$ tree
.
├── script.sh
└── songs
├── artiste=linkin-park_album=meteora_id=02_song=Don't-stay.mp3
├── artiste=linkin-park_album=meteora_id=02_song=Session.mp3
├── artiste=linkin-park_album=meteora_id=02_song=Somewhere-I-Belong.mp3
├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Bleed-It-Out.mp3
├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Given-Up.mp3
├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Leave-out-All-The-Rest.mp3
├── id=01_artiste=eminem_album=recovery_song=cold-wind-blows.mp3
├── id=01_artiste=eminem_album=recovery_song=on-fire.mp3
└── id=01_artiste=eminem_album=recovery_song=talking-2-myself-(feat-kobe).mp3
1 directory, 10 files
After:
$ tree
.
├── org_songs
│ ├── eminem
│ │ └── recovery
│ │ ├── cold-wind-blows.mp3
│ │ ├── on-fire.mp3
│ │ └── talking-2-myself-(feat-kobe).mp3
│ └── linkin-park
│ ├── meteora
│ │ ├── Don't-stay.mp3
│ │ ├── Session.mp3
│ │ └── Somewhere-I-Belong.mp3
│ └── minutes-of-midnight
│ ├── Bleed-It-Out.mp3
│ ├── Given-Up.mp3
│ └── Leave-out-All-The-Rest.mp3
├── script.sh
└── songs
├── artiste=linkin-park_album=meteora_id=02_song=Don't-stay.mp3
├── artiste=linkin-park_album=meteora_id=02_song=Session.mp3
├── artiste=linkin-park_album=meteora_id=02_song=Somewhere-I-Belong.mp3
├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Bleed-It-Out.mp3
├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Given-Up.mp3
├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Leave-out-All-The-Rest.mp3
├── id=01_artiste=eminem_album=recovery_song=cold-wind-blows.mp3
├── id=01_artiste=eminem_album=recovery_song=on-fire.mp3
└── id=01_artiste=eminem_album=recovery_song=talking-2-myself-(feat-kobe).mp3
7 directories, 19 files
Also note I'm using cp
to copy the files instead of mv
to move them. I recommend just doing a copy first and then removing the old files afterwards as long as everything worked out right. Otherwise you risk making a mess of or losing some data.