分页: 1 / 1

脚本中对含有特殊符号(如空格)的文件名的完美解决方法及思路

发表于 : 2013-04-05 3:12
needle
以前写脚本,最头痛的莫过于遇到文件名带空格,或者一些别的特殊符号,于是干脆加个注释,标明解决不了~
后来过了很长一段时间才搞定~真是要多上网,多读书,少吃零食,多抽烟啊~~ :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

Re: 脚本中对含有特殊符号(如空格)的文件名的完美解决方法及思路

发表于 : 2013-04-05 10:50
YeLee
给力,支持一个。 :em11 :em11 :em11