免费注册 查看新帖 |

Chinaunix

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

shell脚本问题:find找到的文件名中如果有空格如何处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-05 12:01 |只看该作者 |倒序浏览
想做一个脚本,将一个目录下的所有文件的编码格式从gb2312转为utf8格式的,结果碰到一个问题。
代码如下:
  1. for i in `find ./ -name "*.txt"`
  2. do
  3.       iconv -f gb2312 -t utf8 $i -o $i
  4. done
复制代码
当文件或目录的名称中没有特殊字符的时候,这个脚本运行没什么问题。
但是如果文件或目录名称中有空格时,那么for循环就无法读入一个完整的文件名了,请问有什么好的解决方法么?

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2010-08-05 12:33 |只看该作者
这个问题是比较棘手的。期待高人。

论坛徽章:
9
2015亚冠之阿尔纳斯尔
日期:2015-09-10 16:21:162015亚冠之塔什干火车头
日期:2015-07-01 16:23:022015年亚洲杯之巴勒斯坦
日期:2015-04-20 17:19:46子鼠
日期:2014-11-13 09:51:26未羊
日期:2014-08-28 18:13:36技术图书徽章
日期:2014-02-21 09:30:15酉鸡
日期:2014-01-14 11:12:49天蝎座
日期:2013-12-09 17:56:53平安夜徽章
日期:2015-12-26 00:06:30
3 [报告]
发表于 2010-08-05 14:11 |只看该作者
提供二个办法.
1 修改IFS啊,如果你非要这样做的话
2 find ./ -name "*.txt" -print0 |xargs -0 iconv

论坛徽章:
34
亥猪
日期:2015-03-20 13:55:11戌狗
日期:2015-03-20 13:57:01酉鸡
日期:2015-03-20 14:03:56未羊
日期:2015-03-20 14:18:30子鼠
日期:2015-03-20 14:20:14丑牛
日期:2015-03-20 14:20:31辰龙
日期:2015-03-20 14:35:34巳蛇
日期:2015-03-20 14:35:56操作系统版块每日发帖之星
日期:2015-11-06 06:20:00操作系统版块每日发帖之星
日期:2015-11-08 06:20:00操作系统版块每日发帖之星
日期:2015-11-19 06:20:00黄金圣斗士
日期:2015-11-24 10:43:13
4 [报告]
发表于 2010-08-05 14:37 |只看该作者
find 后加个引号?

论坛徽章:
0
5 [报告]
发表于 2010-08-05 15:46 |只看该作者
提供二个办法.
1 修改IFS啊,如果你非要这样做的话
2 find ./ -name "*.txt" -print0 |xargs -0 iconv
HH106 发表于 2010-08-05 14:11



    多谢你的答复。不过这里有几个疑问,请指教。
1.IFS具体指的是什么呢。我是linux的新手,对这方面不是很了解。
2.
  1. find ./ -name "*.txt" -print0 |xargs -0 iconv
复制代码
。 将它补完一下
  1. find ./ -name "*.txt" -print0 |xargs -0-
复制代码
这里也有一个问题,iconv的默认输出是std out,如果想将输出定义为覆盖原文件,xargs似乎就无法办到了。
不过经过你的提醒,使用-print0参数,也让我想到另一个解决办法:
  1. find ./ -name "*.txt" -print0 -exec  iconv -f gb2312 -t utf8 {} -o {} \;
复制代码
这样就可以将一个目录下的所有文件的文件编码格式转成utf8。

3.不过2中的方法还是无法解决这个问题:如果find找到的文件名中有空格,还能让for循环正确取出文件名吗?谁有好办法

论坛徽章:
9
2015亚冠之阿尔纳斯尔
日期:2015-09-10 16:21:162015亚冠之塔什干火车头
日期:2015-07-01 16:23:022015年亚洲杯之巴勒斯坦
日期:2015-04-20 17:19:46子鼠
日期:2014-11-13 09:51:26未羊
日期:2014-08-28 18:13:36技术图书徽章
日期:2014-02-21 09:30:15酉鸡
日期:2014-01-14 11:12:49天蝎座
日期:2013-12-09 17:56:53平安夜徽章
日期:2015-12-26 00:06:30
6 [报告]
发表于 2010-08-05 17:15 |只看该作者
回复 5# slother


    IFS是内部域分隔符,默认是空格,tab,和新行.
如果文件名含有空格,在for中将会被拆开成二部分.因此要改变默认的IFS.
如果你一定要用for循环的话,try
OLDIFS=$IFS
IFS=:
for i in `find ./ -name "*.txt"`
do
      iconv -f gb2312 -t utf8 $i -o $i
done
IFS=$OLDIFS

论坛徽章:
0
7 [报告]
发表于 2010-08-05 22:17 |只看该作者

  1. 22:14:10 >iconv -f gbk -t utf8 带空格\ \ 的文件.txt
  2. 中文测试文件
复制代码

  1. 22:14:51 >find ./ -type f | while read f;do iconv -f gbk -t utf8 $f ;done
  2. iconv: cannot open input file `./带空格': No such file or directory
  3. iconv: cannot open input file `的文件.txt': No such file or directory

复制代码

  1. 22:15:08 >find ./ -type f | while read f;do iconv -f gbk -t utf8 "$f" ;done
  2. 中文测试文件
  3. 22:15:13 >

复制代码

论坛徽章:
0
8 [报告]
发表于 2010-08-05 22:53 |只看该作者
用引号呀。

论坛徽章:
0
9 [报告]
发表于 2010-08-07 14:11 |只看该作者
回复 6# HH106


    多谢指点,我明白了,等下去试一下。

论坛徽章:
0
10 [报告]
发表于 2010-08-07 14:15 |只看该作者
{:3_183:} 杀鸡焉用牛刀....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP