It's been a while since I've used make
, so bear with me...
I've got a directory, flac
, containing .FLAC files. I've got a corresponding directory, mp3
containing MP3 files. If a FLAC file is newer than the corresponding MP3 file (or the corresponding MP3 file doesn't exist), then I want to run a bunch of commands to convert the FLAC file to an MP3 file, and copy the tags across.
The kicker: I need to search the flac
directory recursively, and create corresponding subdirectories in the mp3
directory. The directories and files can have spaces in the names, and are named in UTF-8.
And I want to use make
to drive this.
I would try something along these lines
FLAC_FILES = $(shell find flac/ -type f -name '*.flac')
MP3_FILES = $(patsubst flac/%.flac, mp3/%.mp3, $(FLAC_FILES))
.PHONY: all
all: $(MP3_FILES)
mp3/%.mp3: flac/%.flac
@mkdir -p "$(@D)"
@echo convert "$<" to "$@"
A couple of quick notes for make
beginners:
@
in front of the commands prevents make
from printing the command before actually running it.$(@D)
is the directory part of the target file name ($@
) Even if this should handle all UTF-8 characters and stuff, it will fail at spaces in file or directory names, as make
uses spaces to separate stuff in the makefiles and I am not aware of a way to work around that. So that leaves you with just a shell script, I am afraid :-/