免费注册 查看新帖 |

Chinaunix

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

[文本处理] svn state删除?文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-01-17 22:54 |只看该作者 |倒序浏览
本帖最后由 mushaofeng12 于 2017-01-17 23:04 编辑

在svn工具使用时,svn st可以看到所有的状态,想删除所有?的文件,脚本如下:

file1=`mktemp -t svn_st.XXXXXX`
svn st | tee $file1
cat $file1 | while read line
do
    fst_char=`echo $line | gawk '{print $1}'`
    lst_char=`echo $line | gawk '{print $2}'`
    if [ $fst_char == "?" ];then
        rm -i -r $lst_char
    fi
done

如上的代码,我想通过询问的方式来判断是否删除开头为?的文件,但是这里估计是因为cat $file1的原因,rm -i 不能询问,而会立即跳出循环,连后续查找?的循环都没有做。

我开始想通过重定向标准输入方式:rm -i -r $lst_char <0,但是还是不行。请问,chinaunix的大侠们这个rm -i交互式询问的问题怎么解决?--------------------------------------------------------------------------------------
svn st命令的输出格式如下:
?      /dut/a.rpt
?      /dut/dir_c
M     /usr/b.cpp
?     d.cpp



论坛徽章:
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
2 [报告]
发表于 2017-01-19 09:22 |只看该作者
完整的脚本是怎么写的?

论坛徽章:
0
3 [报告]
发表于 2017-01-19 09:31 |只看该作者
回复 2# blackold


上面的脚本已经比较完整了,其他部分都是echo等输出。谢谢大虾关照哈。

论坛徽章:
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
4 [报告]
发表于 2017-01-19 10:16 |只看该作者
回复 3# mushaofeng12

你把   
if [ $fst_char == "?" ];then
        rm -i -r $lst_char
    fi
改为

  1. echo  'rm -i -r' $lst_char
复制代码
跑一下脚本看看。

论坛徽章:
0
5 [报告]
发表于 2017-01-19 11:13 |只看该作者
回复 4# blackold

echo 'rm -i -r' $lst_char

输出:
rm -i -r ab
rm -i -r cd
rm -i -r ef
rm -i -r gh

--------------------------------

如果用rm -i -r $lst_char,则输出
rm: remove regular empty file 'ab'?
然后就跳出循环执行下面的语句了。

--------------------------------
如果用rm -rf $lst_char,则不会报
rm: remove regular empty file 'ab'?(因为-f)
直接就删除了对应的文件或目录。

论坛徽章:
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
6 [报告]
发表于 2017-01-19 20:24 |只看该作者
回复 5# mushaofeng12

标准输入被 rm -i 吃完了,所以立即跳出循环。

try:

  1. file1=`mktemp -t svn_st.XXXXXX`
  2. svn st | tee $file1
  3. exec 3< $file1
  4. while read -u 3 line
  5. do
  6.     fst_char=`echo $line | gawk '{print $1}'`
  7.     lst_char=`echo $line | gawk '{print $2}'`
  8.     if [ $fst_char == "?" ];then
  9.         rm -i -r $lst_char
  10.     fi
  11. done
  12. exec 3>&-

复制代码


论坛徽章:
0
7 [报告]
发表于 2017-01-20 09:23 |只看该作者
回复 6# blackold


exec 3< $file1
while read -u 3 line

大侠,果然是大侠,这种方式完美解决问题。

看我解释对吗:
这个问题关键,是在while read -u 3 line。
cat $file1的方式把cat命令的所有输出作为while命令的输入,所以read只读到了一行,其他行都是rm -i -r $lst_char吃掉了。
而用while read -u 3 line的方式read命令只从重定向的3读取,rm -i -r $lst_char可以从标准输入0读取。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP