免费注册 查看新帖 |

Chinaunix

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

[文本处理] SEHLL 从一系列文件列表中排除指定目录 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-03 19:42 |只看该作者 |倒序浏览
手头上遇到的一个小需求,觉得有点意思,分享下,抛砖以引玉
软件包的文件复制时,排除指定目录
需求: 在 Linux 系统中,将已安装的软件包中的文件列表中复制到另外目录中。
但要排除指定的目录,即此指定的目录不需要复制。

glibc 包中有
f: /etc/nscd.conf
d: /usr/
d: /usr/bin/
f: /usr/bin/catchsegv
f: /usr/include/_G_config.h
f: /usr/include/a.out.h

指定排除 /usr/share/doc /usr/include 两个目录
那么,上述列表中只复制以下两个
f: /etc/nscd.conf
f: /usr/bin/catchsegv

用户提供的排除目录,末尾的可能有带 '/', 也可能不带,也有可能写在同一行,或分成多行,如:
/usr/share/man/ /tmp/
/usr/include

文件列表则由包安装管理器自行检索得到,一般是一项一行
试了挺久,主要是路径前缀不知道如何匹配,
如文件: /usr/sharefoo 不能被 /usr/share 的写法给截了
如果要排除 /usr/ /usr/share 两个目录, 那么 /usr/share/{man,doc,themes,locale}/* 等目录
及其下全部分内容都属于排除的范围。
coreutils 包有个 /usr/bin/[ 文件,让 grep 遇到,可能就犯傻了。

以下是有  awk 的实现

  1. echo "$EXDIR , $PKGFILES" | awk '
  2.     BEGIN {
  3.         met_sep = 0
  4.     }   
  5.     {   
  6.         for (i = 1; i <= NF; ++i)
  7.         {
  8.             if ( $i == ",")
  9.             {
  10.                 met_sep = 1
  11.                 continue
  12.             }
  13.             if (met_sep == 0)
  14.             {
  15.                 ed[$i] = 1
  16.             }
  17.             else
  18.             {
  19.                 pf[$i] = 1
  20.             }
  21.         }
  22.     }
  23.     END {
  24.         prd = ""
  25.         for (i in pf)
  26.         {
  27.             is_needed = 1
  28.             for (j in ed)
  29.             {
  30.                 sub("/$", "", j)
  31.                 left_str = gensub(j, "", 1, i)
  32.                 if (left_str == i)
  33.                     continue
  34.                 if (length(left_str) == 0 || match(left_str, "^/"))
  35.                 {
  36.                     is_needed = 0
  37.                     break
  38.                 }
  39.             }
  40.             if (is_needed == 1)
  41.                 prd = prd " " i
  42.         }
  43.         print prd
  44.     }'
复制代码

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
2 [报告]
发表于 2013-12-03 20:12 |只看该作者
tseesing 发表于 2013-12-03 19:42

glibc 包中有
f: /etc/nscd.conf
d: /usr/
d: /usr/bin/
f: /usr/bin/catchsegv
f: /usr/include/_G_config.h
f: /usr/include/a.out.h

指定排除 /usr/share/doc /usr/include 两个目录
那么,上述列表中只复制以下两个
f: /etc/nscd.conf
f: /usr/bin/catchsegv


我想问:
d: /usr/
d: /usr/bin/

这两个目录为啥不复制?? 也没见你指定排除呀!!!

论坛徽章:
0
3 [报告]
发表于 2013-12-03 20:43 |只看该作者
本帖最后由 tseesing 于 2013-12-03 20:49 编辑

回复 2# 关阴月飞

O   我没说明白,另外的代码中
cp 用了参数 --parents
所以,/usr/{,bin/} 这两个目录会在复制文件的时候按需建立,所以忽略说了
也就是说 cp 后,目标目录的结构与被复制的文件的结构上一致的(除了目标目录可能多几个层)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP