Давайте рассмотрим это поэтапно.
Сначала создайте символическую ссылку и удалите существующую ссылку с таким именем, если она есть:
ln -fs filename linkname
Теперь, чтобы составить список существующих файлов:
existing_files = $(wildcard dir1/dir2/*.txt)
Пока все хорошо. Давайте предположим, что это дает нам dir1/dir2/red.txt dir1/dir2/green.txt
.
# The next line shows where I would want to put the symbolic links
symlinks = $(wildcard new_dir1/new_dir2/*.txt)
Это даст вам список вещей, которые уже существуют в этом каталоге, что, вероятно, не то, что вы намеревались. Мы должны составить список ссылок, которые мы хотим из списка файлов, которые у нас есть:
filenames := $(notdir $(existing_files))
symlinks := $(addprefix new_dir1/new_dir2/, $(filenames))
Теперь для правила или правил для создания символических ссылок. Мы могли бы написать два явных правила:
new_dir1/new_dir2/red.txt: dir1/dir2/red.txt
ln -fs dir1/dir2/red.txt new_dir1/new_dir2
new_dir1/new_dir2/green.txt: dir1/dir2/green.txt
ln -fs dir1/dir2/green.txt new_dir1/new_dir2
но это ужасно избыточно, и к тому же мы заранее не знаем имен файлов. Сначала мы можем удалить часть избыточности, определив переменную и используя автоматическую переменную $<
:
DEST_DIR := new_dir1/new_dir2
$(DEST_DIR)/red.txt: dir1/dir2/red.txt
ln -fs $< $(DEST_DIR)
$(DEST_DIR)/green.txt: dir1/dir2/green.txt
ln -fs $< $(DEST_DIR)
Теперь мы можем увидеть, как заменить эти правила на шаблонное правило :
$(DEST_DIR)/%.txt: dir1/dir2/%.txt
ln -fs $< $(DEST_DIR)
Теперь все, что нам нужно, это главное правило, требующее ссылки:
.PHONY: make_some_links
make_some_links: $(symlinks)