2015-03-03 2 views
0

Я пытаюсь перейти от моего Времнного создания сценария, который перебирает все ребенок дома проекта, и создает соответствующий почтовый файл для каждого:Makefile: Создание архивных файлов всех вложенных папок

for i in */; do 
    if [[ -d $i ]]; then 
     echo "Processing folder $i"; 
     zip "${i%/}.zip" "$i"*.txt 
     echo "Created ${i%/}.zip" 
    fi 
done; 

Первая строка неудобная, но она просто перебирает все поддиры, исключая скрытые. Как вы видите, логика проста, но делать это в Makefile без явного указания каждого подкаталога представляется сложным.

В идеале мы должны начать с:

project 
    subdir1 
    file1.txt 
    file2.txt 
    subdir2 
    file3.txt 

... и в конечном итоге с:

project 
    subdir1 
    file1.txt 
    file2.txt 
    subdir1.zip 
    subdir2 
    file3.txt 
    subdir2.zip 

Есть ли способ безопасно получить этот вид рекурсии из косметики?

редактировать: Вымытый базовый сценарий, благодаря Этан

+1

Ваш оригинальный сценарий небезопасен для каталогов с пробелами или метасимволами оболочки только FYI. Использование 'for i в * /; do' было бы. Внутренняя находка может иметь схожие проблемы с пробелами/новыми символами в именах файлов в зависимости от того, как 'zip' обрабатывает свой вход. Если ваше дерево не глубоко вложено с помощью 'zip '$ i.zip" "$ i"/*. Txt'/etc. вместо этого безопаснее. –

+0

Вы можете просто поместить этот точный скрипт в цель своего файла makefile, если хотите. –

+0

@EtanReisner Спасибо за комментарии к скрипту (будет его редактировать). Я знаю, что могу просто бросить это в Makefile, но думал, что может быть «правильный» способ сделать это в синтаксисе make. – Zac

ответ

3

Нечто подобное может сделать то, что вы хотите.

SUBDIRS := $(wildcard */) 
ZIPS := $(addsuffix .zip,$(subst /,,$(SUBDIRS))) 

$(ZIPS) : %.zip : | % 
    zip [email protected] $*/*.txt 

dist: $(ZIPS) 

Вы, возможно, потребуется скорректировать предпосылки по этому статического шаблонного правила и т.д., чтобы получить правильное поведение Перестройка (должны определить, когда он нуждается в восстановлении, она должна всегда перестраивать, не должен он никогда не перестраивать, когда .zip файл существует и т. д.).

+0

Хмм, когда я запустил это в тестовом каталоге, я пропустил шаблон для zip: 'zip warning: name not match:% */*. Txt'. Мне нужно взглянуть на конкретную ошибку замещения, но ваше решение именно то, что я искал. – Zac

+1

Это потому, что я опечатал его. Попробуйте '$ */*. Txt'. –

Смежные вопросы