У меня есть Make-файл для компиляции ЛАТЕКСА *.tex файл (tex-> dvi-> PS-> PDF). Затем у меня есть команда, чистая для удаления ненужных временных файлов (dvi, PS...) как это:
rm `ls | grep "^${FILENAME}\.(aux|dvi|ps|log)"`
но это удаляет даже *.pdf файл, который я должен сохранить. Если я повторяю результат ls | grep
, я нашел, требуются все файлы, расширение которых начинается с первой буквы расширения в regexp, таким образом,
echo `ls | grep "^${FILENAME}\.[aux|dvi|ps|log]"`
#echoes proj.aux proj.dvi proj.log proj.pdf proj.ps
Другие файлы оставляют неизменными (*.tex)
Как я выбираю только файлы с расширениями от regexp (и не *.pdf)?Заранее спасибо.
На командной строке необходимо использовать шарик оболочки вместо того, чтобы пытаться regex-соответствовать выводу ls
. Например, в ударе Вы могли использовать любого расширение фигурной скобки
rm "$FILENAME".{aux,dvi,log,ps}
или (если расширено globbing включен),
rm "$FILENAME".!(tex|pdf)
В Make-файле необходимо, вероятно, использовать make
собственные текстовые функции преобразования команды - в случае GNU делают, например, Вы могли использовать addprefix
например.
FILENAME = foo
.PHONY: clean
clean:
@echo rm $(addprefix $(FILENAME),.aux .dvi .log .ps)
предоставление
$ make clean
rm foo.aux foo.dvi foo.log foo.ps
Посмотрите, что GNU делает: Функции для Строковой Замены и Анализа
Это выражение сработало: ls | grep -E ".(aux|dvi|ps|log)"
. Вы не использовали флаг -E, который позволяет grep использовать расширенные регулярные выражения (т. Е. Позволяет | интерпретироваться как оператор или). Примечание: вы могли бы также сделать ls | grep -E ".aux|dvi|ps|log"
и получить желаемый результат.
В первую очередь, не используйте ls, использование находят. Но так или иначе вот то, что Вы ищете в grep странице справочника:
Matcher Selection
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see
below).
так используйте что-то вроде этого:
echo `find . | grep -E "^${FILENAME}\.(aux|dvi|ps|log)"`