Shell处理带空格的文件名的方法_linux shell

现在很多人命名的时候都喜欢用空格,例如“An Introduction.doc”。但是这种命名方式给Linux命令行工具和Shell带来了困扰,因为大多数命令中,都是默认以空格做为值与值之间的分隔符,而不是做为文件名的一部分。

看下面的脚本,我们可以了解的更清楚:

执行的结果如下:

实际上,当前目录的文件只有两个:

对于简单的文件名,如上例中,我们也可以通过 for i in *doc 这样简单的方法来获得文件列表。但是对于复杂的环境,如下图,我们如何获得这些列表呢?

有一个办法,通过 for i in "* *" 可以获得文件名的列表,但是一个很糟糕的列表,因为这个结果是一个两个文件名在一起的列表,我们完全无法拿来做后续的操作,如下图所示

通过 "*\ *" 这样的技巧可以避免上面所说的问题,但是在应用mv或其他操作时,还是会出现问题。

上面的问题,可以通过将变量放入引号中("$i")解决,通常情况下,引号中的空格可以被正确的处理。但这并不是一个恒久的解决办法,因为我们无法处理管道、子Shell等复杂的情况。

一个终极的解决办法就是设置IFS(the Internal Field Separator),不要用空格做为IFS,选择其他的符号。先来看看man page:

IFS: The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read built-in command. The default value is “<space><tab><new-line>”.

另外一个办法就是在对文件名进行处理之前,先将空格替换为特殊的自定义符号,然后在处理结束的时候,再替换回来

safename="$(echo name | sed 's/ /_-_/g')"

original="$(echo $safename | sed s'/_-_/ /g')"

其他还有一些方法,例如利用find命令。

时间: 2024-09-19 19:59:39

Shell处理带空格的文件名的方法_linux shell的相关文章

Shell交互批量更改主机名的方法_linux shell

需求分析:      1.ssh公钥拷贝,提供无密码管理.      2.批量同步hosts文件到多台主机.      3.批量修改主机名. 实现: 首先编辑一份用于同步到多台主机的hosts文件 vi /etc/hosts 192.168.0.1 server1 192.168.0.2 server2 192.168.0.3 server3 192.168.0.4 server4 192.168.0.5 server5 192.168.0.6 server6 192.168.0.7 serve

Shell脚本中获取进程ID的方法_linux shell

提问: 我想要知道运行中脚本子shell的进程id.我该如何在shell脚本中得到PID. 当我在执行shell脚本时,它会启动一个叫子shell的进程.作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为"批处理进程"). 在某些情况下,你也许想要知道运行中的子shell的PID.这个PID信息可以在不同的情况下使用.比如,你可以使用shell脚本的PID在/tmp下创建一个唯一的临时文件.有时侯脚本需要检测所有运行的进程,它可以从进程列表中排除自身

shell中的各种括号的使用方法_linux shell

在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern) 现在分述如下: 1.Shell中变量的原形:${var}大家常见的变量形式都是$var

Shell逐行读取文件的4种方法_linux shell

在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法.为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率. 方法1:while循环中执行效率最高,最常用的方法. 复制代码 代码如下: function while_read_LINE_bottm(){ While read LINE do echo $LINE done  < $FILENAME } 注释:我习惯把这种方式叫做read釜底抽薪,因为这种方

Shell脚本判断IP地址是否合法的方法_linux shell

使用shell校验IP地址合法性 使用方法: 复制代码 代码如下: [root@yang python]# bash check_ip.sh IP地址 执行结果:返回值0校验合法,非0不合法.shell代码: 复制代码 代码如下: [root@yang python]# vi check_ip.sh #!/usr/bin/shCheckIPAddr(){echo $1|grep "^[0-9]\{1,3\}\.\([0-9]\{1,3\}\.\)\{2\}[0-9]\{1,3\}$"

Bash Shell 注释多行的几种方法_linux shell

1.最简单方法 复制代码 代码如下: :<<BLOCK ....注释内容 BLOCK 把输入重定义到前面的命令,但是 : 是空命令,所以就相当于注释了. 如果注释中有反引号的命令就会报错,反引号部分不会被注释掉,例如 var=`ls -l` 就不会被注释掉. 2.解决注释中有反引号的问题 A.方法一 复制代码 代码如下: :<<BLOCK' ....注释内容 'BLOCK B.方法二 复制代码 代码如下: :<<'BLOCK ....注释内容 BLOCK' C.方法三

shell 编程中空格的使用方法_linux shell

1.定义变量时, =号的两边不可以留空格.eg: gender=femal----right gender =femal---–wrong gender= femal---–wrong2.条件测试语句 [ 符号的两边都要留空格.eg: if [ $gender = femal ]; then---right. echo "you are femal"; fi if[ $gender...-----------------------wrong if [$gender...-------

Shell动态生成数组的多种方法_linux shell

如果对linux shell 数组不是很熟悉的话,请看上一篇文章:linux shell 数组建立及使用技巧  ,这篇文章主要讲是动态生成数组系列.方法应该很多,我这里主要以一个求和计算的题目为例进行分析.   题目:请用linux shell 写一段脚本,实现从1..1000中所有偶数的和值.   方法一: 通过while 循环得到需要的结果: start=1; total=0; while [ $start -le 1000 ];do [[ $(($start%2)) == 0 ]]&&

linux bash中too many arguments问题的解决方法_linux shell

判断一个文件的内容是不是为空,使用语句: if test -z `cat filename` 当filename为空或者只有一行没有空格的字符串的时候,一切正常,反之,则会报:too many arguments,甚至是: binary operator expected之类的错误. 参考文章:http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/index.html 原因分析:filename中的空格回车等迷惑了bash.如果