2017-01-12 3 views
1

Я хочу знать, как я могу преобразовать этот shell script в Makefile и использовать make all для выполнения всех операций скрипта. У меня есть два каталога pictures и thumbs, где thumbs пуст перед запуском сценария, а pictures содержит некоторые файлы .jpg. Наконец, это shell script, что я хочу, чтобы преобразовать в Makefile:Переход от оболочки к Makefile

#!/bin/bash 
DIR="thumbs" 
if [ "$(ls -A $DIR)" ]; then 
    p=$(find pictures/|grep "jpg"|cut -d"/" -f2) 
    for i in $p 
    do 
     m=$(ls -l pictures/$i | cut -d" " -f7) 
     n=$(ls -l thumbs/$i | cut -d" " -f7) 
     if [ "${m//':'}" -gt "${n//':'}" ] ;then 
      rm thumbs/$i 
      convert -thumbnail 100 pictures/$i thumbs/$i 
     fi 
    done 
else 
    find pictures/ |cut -d"/" -f2 | grep "jpg"| \ 
     awk '{system("convert-thumbnail 100 pictures/" $0 " thumbs/" $0)}' 
fi 
+2

Положите его в скрипт и запустить скрипт от Make –

+0

ли вы имеете в виду вы хотите * переписать * скрипт как Makefile? В этом случае вам нужно ограничить себя функциями, определенными для POSIX 'make', или вы захотите зависеть от GNU' make'? –

ответ

2

От Makefile вы можете вызвать программу.

Пример

$ cat a.sh 
echo From Makefile 
$ cat Makefile 
all: 
    ./a.sh 

Тест:

$ make 
./a.sh 
From Makefile 
+0

Upvote for lolz ;-) –

1

Вы можете реализовать поведение вашего кода оболочки гораздо проще в Makefile, по крайней мере, если вы готовы полагаться на GNU make. Я интерпретирую это как то, что вы спрашиваете (в частности, зависимость от GNU). Это довольно функциональный грубый срез:

THUMBS = $(patsubst pictures/%,thumbs/%,$(wildcard pictures/*jpg*)) 

all: $(THUMBS) 

thumbs/%: pictures/% thumbs 
    convert -thumbnail 100 '$<' '[email protected]' 

thumbs: 
    mkdir -p '[email protected]' 

.PHONY: all 

Примечание:

  • THUMBS сделать переменный получает значение в список уменьшенных изображений, которые вы хотите управлять, на основе расширения оболочки шарика pictures/*jpg* и заменяя каждое вхождение pictures/ на thumbs/.

    • Узор выбирается, чтобы соответствовать код оболочки, но, возможно, вы действительно хотите что-то больше похоже $(wildcard pictures/*.jpg)
    • имена файлов с пробелами в них собираются представить хитрую проблему, если вам нужно беспокоиться о них; имена файлов с некоторыми другими специальными символами тоже, хотя и немного меньше, так
    • patsub и wildcard функции GNU расширения
    • Можно также объединить определение THUMBS в правило для all, и избежать отдельной переменной
  • Правило для thumbs/%: pictures/% thumbs использует синтаксис правила шаблона, специфичного для GNU; эту конкретную форму трудно выразить POSIX make.

  • Каталог thumbs создается, если отсутствует, но ошибки будут иметь место, если есть обычный файл с таким именем в пути

  • make all (или просто make) обновят все устарелые эскизы; он не опирается на ту же логику сравнения даты как оригинальный сценарий (который является хорошо вещью)

  • .PHONY правила просто быть осторожным. Это предотвращает наличие фактического файла с именем «все» от вмешательства в работу make.

+0

Очень приятное и лучшее решение. –