#!/bin/bash
# April 4, 2009
# m3u_cp.sh
#
# Take an m3u file and copy all associated mp3 files
# to a destination directory and generate a new m3u.
#
# Used to copy m3u playlists from computer to Garmin.
if [ $# -lt 2 ]; then
echo "Usage: m3u_cp.sh some.m3u /dst"
exit 0
fi
# Read the m3u file into an array
declare -a M3U
exec 10<"$1"
let count=0
while read LINE <&10; do
M3U[$count]=$LINE
((count++))
done
exec 10>&-
# Determine the m3u's filename
if [[ $1 =~ [^/]*m3u ]]; then
m3u_path="$2/$BASH_REMATCH"
fi
# If playlist arleady exists, delete it
if [ -f "$m3u_path" ]; then
rm -f "$m3u_path"
fi
# Loop through the m3u lines
i=0
while [ $i -lt ${#M3U[@]} ]; do
# The current line is a comment, do nothing with it
if [ ${M3U[$i]:0:1} = "#" ]; then
echo ${M3U[$i]} >> "$m3u_path"
#Current line is a path to an mp3 file
else
# Get the current songs filename
if [[ ${M3U[$i]} =~ [^/]*mp3 ]]; then
song=$BASH_REMATCH
mpath=$( echo ${M3U[$i]} | tr -d '\r' )
# if the song doesn't exist, copy it to the desitnation folder
if [ -f "$2/$song" ]; then
echo File Exists -- $song
else
echo Copying -- $song
cp "$mpath" "$2/$song"
fi
# Write the song in the m3u file
echo $song >> "$m3u_path"
else
echo "The regex for finding the song's filename is fraked up."
fi
fi
let i=i+1
done
exit 0
In the middle of writing this I really started wondering why I used bash. Perl would've been a lot easier.