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

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
needle
帖子: 78
注册时间: 2009-12-01 13:34
送出感谢: 2 次
接收感谢: 5 次

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

#1

帖子 needle » 2013-04-05 3:12

以前写脚本,最头痛的莫过于遇到文件名带空格,或者一些别的特殊符号,于是干脆加个注释,标明解决不了~
后来过了很长一段时间才搞定~真是要多上网,多读书,少吃零食,多抽烟啊~~ :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 三思~
头像
YeLee
论坛版主
帖子: 26386
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
送出感谢: 25 次
接收感谢: 307 次
联系:

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

#2

帖子 YeLee » 2013-04-05 10:50

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

回到 “Shell脚本”