免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1769 | 回复: 9

[文本处理] 【求大神】关于先sed再xargs,是不是BUG了? [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2017-03-19 09:57:50
发表于 2014-12-04 13:22 |显示全部楼层

实现要求:用find 查找log目录,并将log下的所有子文件夹和文件都删掉,但是不删除log目录本身,
        所以我使用sed在log尾部添加了/*,再通过 xargs 来 rm -ri log/*
        $ ls  log
        log1  1.log


我的写法:find ./ -type d -name "log" | sed -n 's/$/\/\*/'p | xargs rm -ri

执行结果:
        $ find ./ -type d -name "log" |sed -n 's/$/\/\*/'p | xargs rm -ri
        rm: 无法删除"./log/*": 没有那个文件或目录


其他的解决方法先不讨论,这里我就想知道这里为什么会出错?按理思路没有问题呀,
难道是rm把log/*的'/*' 当成了字符串,并没有去通配log下的文件,要怎么解决?

之后我先find,再用sed 拼出了 rm -ri ./log/* 重定向到temp.sh文件中,添加权限再用sh执行的时候,也报同样的
错误“rm: 无法删除"./log/*": 没有那个文件或目录”

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
发表于 2014-12-04 14:05 |显示全部楼层
  1. eval "`find ./ -type d -name "log" | xargs -I {} echo rm -ri {}/*`"
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2014-12-04 14:46 |显示全部楼层
回复 1# 农民伯伯丶


    1. xargs 是直接执行的,没有调用 shell。

    2. 重定向到 .sh 后再执行应该没有问题的。

论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2017-03-19 09:57:50
发表于 2014-12-04 21:20 |显示全部楼层
回复 2# Shell_HAT
{:3_203:}  果然可行,我改写成这样: eval "`find ./ -type d -name "log" | sed -n 's/^/rm -ri /;s/$/\/\*/'p`"

不过大神,我用sed 再xargs为什么会问题呢?xargs不是调用rm 命令去删除吗?find+xargs怎么又可以呢?find的结果不也是字符串么?
  

论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2017-03-19 09:57:50
发表于 2014-12-04 21:22 |显示全部楼层
回复 3# blackold

find + xargs 也是让rm命令直接处理字符串嘛
为什么加个sed修改下字符串就执行不了呢?

sed保存到sh文件里也执行不了,之前测试过一次,报一样的错

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
发表于 2014-12-04 22:08 |显示全部楼层
回复 4# 农民伯伯丶


起作用的是eval
sed有没有无所谓

论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2017-03-19 09:57:50
发表于 2014-12-04 22:17 |显示全部楼层
回复 6# Shell_HAT


    eval起作用这个俺明白,我是想知道为什么用sed处理的字符串不能用xargs rm嘛?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2014-12-04 22:49 |显示全部楼层
回复 5# 农民伯伯丶


    .sh文件的内容是怎么样的?

    执行时有什么输出?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2014-12-04 22:51 |显示全部楼层
回复 5# 农民伯伯丶


    这与 sed 没有关系。

   因为你加了 * , 这是特殊字符,需要 shell 来处理,但 xargs 是直接执行命令的,没有调用 shell 来执行,所以出错了。

论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2017-03-19 09:57:50
发表于 2014-12-04 23:16 |显示全部楼层
回复 8# blackold


    奇怪,我白天在办公室的suse 10环境下,重定向到.sh文件里再用sh执行也报错: ./log/*文件或者目录不存在,晚上回家在ubuntu下这样操作又木有问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP