免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1968 | 回复: 6
打印 上一主题 下一主题

[文本处理] 如何根据文件夹内文件变化更新特定文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2019-02-23 15:32 |只看该作者 |倒序浏览
本帖最后由 mksu 于 2019-02-23 15:51 编辑

请教一下大家  有这样一个要求

目录下有 一个src文件夹存放一些c文件, 这些c 文件是通过module.mk 包含进编译里面的

cat  module.mk

...
C_FILES  += $(TOY_AP23341_PATH)/src/toy_ap23341_drv.c
C_FILES  += $(TOY_AP23341_PATH)/src/toy_ap23341_api.c
...


如果有一天,toy_ap23341_drv.c被删掉了,那么module.mk  就需要更新,将C_FILES  += $(TOY_AP23341_PATH)/src/toy_ap23341_drv.c 删除

对应开发工程中可能新增c 文件,新增c 文件也需要添加到module.mk  中

我写了一个函数用来实现这个功能, 但是只能实现新增文件, 如果有文件删除 不知道如何做, (一开始是不管三七二十一 全部删干净,再一个个加,但这样等于module.mk 一直在变...即便没有c 文件增加或删除 ,这样不符合要求)

我又尝试遍历, 但是这样一个for 嵌一个for 也指定怎么对比。。

  1. <p>update_module_mkfile () {

  2.         for enable_module in ${module_name_list[*]}
  3.         do
  4.                 MODULE_NAME="$(echo $enable_module | tr '[:lower:]' '[:upper:]')"       
  5.                 #如果有一个c文件之前被添加了,后面由删除了,如果更新module.mk
  6.                 #删除每个module.mk下面的C_FILES
  7.                 #sed -i '/^C_FILES/d' $TOY_MODULE_PATH/$enable_module/moudle.mk</p><p>
  8. #cnt=0
  9.                 #for c_old_file in $(sed -r -n 's/^C_FILES.*+=.*\/src\/(.*)/\1/p' $TOY_MODULE_PATH/$enable_module/module.mk)
  10.                 #do
  11.                         #c_old_file_list[cnt]=`basename $c_old_file` #旧包含c文件名
  12.                         #cnt=$(expr $cnt + 1)
  13.                 #done
  14.                
  15.                 #遍历src目录下所有.c 文件,将它们按照加入到module.mk 中
  16.                 for c_file in $(ls -l $TOY_MODULE_PATH/$enable_module/src | awk '/.c/ {print $NF}')
  17.                 do
  18.                         echo "update $enable_module module.mk"
  19.                         #grep -q 先查找这个c 文件是否已经包含进module.mk里面
  20.                         #没包含则执行下面动作
  21.                         #找到 #ADD_CFILES 字符一行 在它的下一行追加
  22.                         grep -q "`basename $c_file`" $TOY_MODULE_PATH/$enable_module/module.mk || \
  23.                         sed -i '/#ADD_CFILES/a\C_FILES  += $('${MODULE_NAME}'_PATH)/src/'`basename $c_file`' \' $TOY_MODULE_PATH/$enable_module/module.mk
  24.                 done               
  25.         done
  26. }</p>
复制代码



论坛徽章:
0
2 [报告]
发表于 2019-02-23 16:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
3 [报告]
发表于 2019-02-23 17:30 |只看该作者
本帖最后由 wh7211 于 2019-02-23 23:16 编辑

回复 1# mksu


代码每次执行都会重新生成module.mk
  1. awk 'BEGIN{system("ls -1 *.c>tmp");a="C_FILES  += $(TOY_AP23341_PATH)/src/"}FILENAME==ARGV[1]{b[a""$0]++;next}b[$0]{c[$0]++}END{for(i in b){if(b[i]&&!c[i]){c[i]++}};for(i in c){print i>"module.mk"}}' tmp module.mk
复制代码

论坛徽章:
0
4 [报告]
发表于 2019-02-23 21:49 |只看该作者
回复 2# 本友会机友会摄友会

就是有一个文件module.mk  它上面通过记录

C_FILES  += $(TOY_AP23341_PATH)/src/xxxxxx.c  

这样的格式  来连接某个文件夹下 所有的.c 文件,

当该文件夹下.c 文件变动时

1.   有新的.c 文件 那么module.mk   就需要添加多一行 C_FILES  += $(TOY_AP23341_PATH)/src/xxxxxx.c
2.   有.c文件 删除时module.mk    就需要 检查一下 是否之前加过这个c 文件的行, 有就将其删除

论坛徽章:
0
5 [报告]
发表于 2019-02-23 21:53 |只看该作者
回复 3# wh7211

大神级 之笔!!!明天到公司试试!!

awk 'BEGIN{system("ls -1 *.c>tmp");a="C_FILES  += $(TOY_AP23341_PATH)/src/"}FILENAME==ARGV[1]{b[a""$0]++;next}b[$0]{c[$0]++}END{for(i in b){if(b&&!c){c++}};for(i in c){print i>"module.mk"}}' tmp module.mk

请问:

1. 是否会产生临时文件tmp ?

除了 'BEGIN{system("ls -1 *.c>tmp");a="C_FILES  += $(TOY_AP23341_PATH)/src/"}   
将 c文件存进 tmp
设置变量a 为字符串 “C_FILES  += $(TOY_AP23341_PATH)/src/” 路径


后下面完全看不懂了~~~~

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
6 [报告]
发表于 2019-02-23 22:34 |只看该作者
本帖最后由 wh7211 于 2019-02-23 23:12 编辑

回复 5# mksu

1. 是否会产生临时文件tmp ?

会的

(一开始是不管三七二十一 全部删干净,再一个个加,但这样等于module.mk 一直在变...即便没有c 文件增加或删除 ,这样不符合要求)

3楼的代码每次执行都会重新生成module.mk,修改为:如果文件没有变化就不会重新生成module.mk:
  1. awk 'BEGIN{system("ls -1 *.c>tmp");a="C_FILES  += $(TOY_AP23341_PATH)/src/"}FILENAME==ARGV[1]{b[a""$0]++;next}{if(b[$0]){c[$0]++}else{d=1}}END{for(i in b){if(b[i]&&!c[i]){c[i]++;e=1}};if(d||e){for(i in c){print i>"module.mk"}}}' tmp module.mk
复制代码




论坛徽章:
0
7 [报告]
发表于 2019-02-25 14:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP