абсолютные пути строк в файле, соответствующих шаблону

У меня есть программа ac, и я хочу, чтобы абсолютные пути заголовков в этой программе c были в отдельном файле. Я использовал следующую команду

find  "${pwd)" -name "#include" > file.txt.

. Может ли кто-нибудь помочь мне с этим?

0
задан 1 July 2019 в 13:43

1 ответ

Если вы ищете заголовочные файлы, которые прямо или косвенно содержатся в текущем каталоге - и предполагается, что все они имеют суффиксы .h, то нет других файлов , названных таким образом - Вы можете просто искать файлы, имена которых заканчиваются на .h:

find "$PWD" -name '*.h' >file.txt

. Вы можете написать "$(pwd)" вместо "$PWD", если хотите. Если вы буквально использовали "${pwd)", как показано в вашем вопросе, то это не сработает, потому что вы не можете закрыть отверстие { с помощью ). Но вы были на правильном пути, потому что использование . просто дало бы вам относительные пути вместо абсолютных.

Причина, по которой name "#include" не работает, заключается в том, что -name указывает имя или шаблон, который должен соответствовать именам файлов . Когда вы включаете заголовочный файл в C, вы используете директиву #include, но это не часть имени.


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

Вы можете получить информацию из файла, подобного Makefile или CMakeLists.txt, если вы используете такую ​​систему. В противном случае, или если это не даст вам того, что вам нужно, вы захотите посмотреть, какие функции предоставляет ваш компилятор для этого. Если вы используете gcc или clang, это опции -M и -MM. Разница в том, что -MM не перечисляет системные заголовки. Формат, который это показывает, для каждого файла filename.c, передаваемого компилятору:

filename.o: filename.c headers...

, где headers... - это список путей к файлам заголовков, разделенных пробелами или пробел, за которым следует обратная косая черта, за которой следует новая строка, в зависимости от длины путей.

Выходные данные показываются таким образом, потому что его основная цель состоит в том, чтобы определить зависимости для построения каждой единицы перевода программы или библиотеки. Синтаксис может использоваться в make-файле. Исходя из вашего описания, звучит так, будто это не тот синтаксис, который вам нужен. Скорее всего, вы можете обработать вывод в нужный вам формат. (Например, если ни один из заголовков не содержит пробельных символов, и вы в порядке с дубликатами, вы можете передать вывод команды, например grep -oP '\S+\.h(?:\s|$)'.)


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

gcc и clang также поддерживают опцию -H, которую вы можете попробовать, но я предполагаю, что она будет давать гораздо больше выходных данных, чем вы хотите. См. Как узнать, откуда включен заголовочный файл? ; man gcc ; и справочное руководство GCC , особенно раздел 3.12 , для получения дополнительной информации.

0
ответ дан 1 July 2019 в 13:43

Другие вопросы по тегам:

Похожие вопросы: