当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 脚本中对含有特殊符号(如空格)的文件名的完美解决方法及思路
帖子发表于 : 2013-04-05 3:12 
头像

注册: 2009-12-01 13:34
帖子: 78
送出感谢: 2
接收感谢: 5
以前写脚本,最头痛的莫过于遇到文件名带空格,或者一些别的特殊符号,于是干脆加个注释,标明解决不了~
后来过了很长一段时间才搞定~真是要多上网,多读书,少吃零食,多抽烟啊~~ :em03

linux系统是由C系语言写的,其中判断一个字符串是否结束,是看是否以\0结尾(null字符),
而系统对一些字符流也是这样处理的,如进程中的环境变量:
代码:
cat /proc/${pid}/environ

结果:
代码:
UPSTART_INSTANCE=LANGUAGE=zh_CN:zhUPSTART_JOB=mountallTERM=linuxLANG=zh_CN.UTF-8UPSTART_EVENTS=startupPWD=/

当初愣不明白为什么不换行~,系统是怎么解析的~
后来才知道,换行符\n属于可输入字符,也是允许存在于字符串中的。
也就是说字符串以\0分隔是最保险的
代码:
cat -A /proc/${pid}/environ

结果:
代码:
UPSTART_INSTANCE=^@LANGUAGE=zh_CN:zh^@UPSTART_JOB=mountall^@TERM=linux^@LANG=zh_CN.UTF-8^@UPSTART_EVENTS=startup^@PWD=/^@


用法及思路:
find命令默认的行为是-print,默认以\n分隔,而-print0选项,则将输出以\0分隔,
然后传给xargs -0,即可解析\0分隔的字符串(很强大的组合)。
sort -z,uniq -z也可解析。
另外,也可以使用tr,将\0处理成我们想要的分隔符:
代码:
tr "\0" "'"


find命令即有-exec又能与xargs组合,
而且配合grep等可模拟ls大部分功能(如果你不嫌手指累的话~,不过在脚本中使用会变得很安全),
我记得有本书上说find枚举30万个文件只需要0.4秒,而ls要4秒~还没echo *的速度快(ls还没bash解析得快吗? :em20 )

当大家对一些文件名的特殊符号无从下手时,不妨试试用find等命令哦。
:em11


_________________
myshell^_^
xfce4.10最好用了……
舒适的滚轮升起焦点设计,大量快捷键,alt移动,糟糕的桌面图标……
珍爱生命,LFS 三思~


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 脚本中对含有特殊符号(如空格)的文件名的完美解决方法及思路
帖子发表于 : 2013-04-05 10:50 
头像

注册: 2008-08-13 8:48
帖子: 26391
地址: 东海硇州,一双管钥。
系统: Fundu i64
送出感谢: 50
接收感谢: 344
给力,支持一个。 :em11 :em11 :em11


_________________
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译