Я бы установил систему контроля версий. Например, используя mercurial, hg init
в каталоге, где хранятся файлы. Затем один раз в день (вероятно, как задание cron
сразу после размещения туда новых файлов), hg addremove
и hg commit
.
Затем, чтобы запустить отчет, вы можете перебрать каждый файл ( для имени файла в dropzone / *; do
) и получить метку времени, с которой он был последний раз зафиксирован, например hg log -l 1 --template "{date (date, '% s')} \ n" "$ filename"
. % s
предоставит вам временную метку в секундах UNIX; вы можете получить текущее значение с помощью $ (date +% s)
, вычесть и приблизительно преобразовать это значение в дни.
Любая VCS ( svn
, git
и т. Д.) Будет работать для вас точно так же, поэтому просто используйте то, что вам удобно.
Почему awk
? для этого? grep -EPo '[^\s]+\.h[\s]' /path/to/src/*.cpp >> Makefile
должно помочь.
Опубликованный (и принятый в настоящее время) ответ grep
имеет ряд проблем, не последней из которых является любая строка, которая содержит последовательность .h
будет напечатана, а не только те, которые совпадают в регулярном выражении в сценарии Awk (например, из ссылки на член структуры, такой как connectedlist.head
). Я бы использовал для этого sed
:
sed -n 's/^"\(.*h\)"$/\1/p "$file" >> Makefile
У меня есть сильное подозрение, что OP не на самом деле хочет сопоставить любую строку, которая заканчивается буквой h
в двойных кавычках, что и делает это регулярное выражение. Возможно, более разумным предположением было бы что-то вроде
sed -n 's/^ *# *include *"\([^"]*\.h\)".*$/\1/p < "$file" >> Makefile
#include
с необязательным пробелом, прежде чем оно станет обоснованным. Суть здесь - регулярное выражение [^ "] * \. H
, которое захватывает строку, не содержащую двойных кавычек и оканчивающуюся буквенными символами .h
.
С помощью awk
вы можете использовать:
awk -F '"' '
/^[[:blank:]]*#[[:blank:]]*include[[:blank:]]+".*\.h"/ {
print $2
}'
Мы устанавливаем разделитель полей на "
, ищем строки, которые выглядят как
#include "something.h"
И из них извлекаем второе поле (то, что находится между первым и вторым "
).