`

Shell如何处理包含空格的文件名

 
阅读更多
Shell中处理包含空格的文件名的方法。

在处理文件时遇到个问题,当文件名包含空格时,for循环就出问题了。
例如,我在当前文件夹下建立3个文件名包含空格的文件:
keakons-MacBook-Pro:test keakon$ touch "test 1"
keakons-MacBook-Pro:test keakon$ touch "test 2"
keakons-MacBook-Pro:test keakon$ touch "test 3"
keakons-MacBook-Pro:test keakon$ ls
test 1 test 2 test 3


然后for循环输出文件名:
keakons-MacBook-Pro:test keakon$ for file in `ls`;
> do echo $file;
> done
test
1
test
2
test
3


可以看到,文件名被分开了。
复制操作也不行:www.jbxue.com
keakons-MacBook-Pro:test keakon$ mkdir ../bak
keakons-MacBook-Pro:test keakon$ for file in `ls`; do cp "$file" ../bak; done
cp: bak is a directory (not copied).
cp: test: No such file or directory
cp: 1: No such file or directory
cp: test: No such file or directory
cp: 2: No such file or directory
cp: test: No such file or directory
cp: 3: No such file or directory


要解决这个问题,当然就要从单词分隔符着手。而bash中使用的是$IFS(Internal Field Separator)这个变量,内容为" \n\t":
keakons-MacBook-Pro:test keakon$ echo $IFS
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000    20  09  0a  0a                                                
0000004
keakons-MacBook-Pro:test keakon$ echo "" | od -t x1
0000000    0a                                                            
0000001


然后把它改成"\n\b",记得修改前先保存一下:
keakons-MacBook-Pro:test keakon$ SAVEIFS=$IFS
keakons-MacBook-Pro:test keakon$ IFS=$(echo -en "\n\b")


现在再执行上述命令就正常了:
keakons-MacBook-Pro:test keakon$ for file in `ls`; do echo $file; done
test 1
test 2
test 3
keakons-MacBook-Pro:test keakon$ for file in `ls`; do cp "$file" ../bak; done
keakons-MacBook-Pro:test keakon$ ls ../bak
test 1 test 2 test 3


最后,别忘了恢复$IFS:
keakons-MacBook-Pro:test keakon$ IFS=$SAVEIFS
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000    20  09  0a  0a                                                
0000004
keakons-MacBook-Pro:test keakon$ IFS=$(echo -en " \n\t")
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000    20  0a  09  0a                                                
0000004
分享到:
评论

相关推荐

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

    但是这种命名方式给Linux命令行工具和Shell带来了困扰,因为大多数命令中,都是默认以空格做为值与值之间的分隔符,而不是做为文件名的一部分。 看下面的脚本,我们可以了解的更清楚: 执行的结果如下: 实际上,...

    Shell中处理包含空格的文件名实例

    主要介绍了Shell中处理包含空格的文件名实例,需要的朋友可以参考下

    处理Shell脚本中带有空格的变量(bash脚本)

    在批量处理音频文件时候使用下面的脚本发现含有空格的文件名并不能被处理; #$1: 遍历的文件夹 rootDir=$1 cd $rootDir allAudioFile=$(find $1 -name *\.mp3) for oneAudioFile in $allAudioFile do mv -f $...

    shell模糊匹配与正则详解

    正则表达式的基本元素包括普通字符和元字符,在Linux shell里面,常用的正则表达式元字符集为:S={* . ^ $ [] \ \<\> \{\} \{n,\} \{n,m\} },每一个元字符都有自己在正则表达式中的含义,下面来介绍一下...

    java实现批量改文件夹、文件名的shell

    由于自己经常利用浏览器插件下载网页图片,由此产生很多的文件夹和文件,这些文件夹的名字多半是网页的title,导致文件夹名很长,文件名多是些很长的数。感觉这样的状况不是很好就自己用java实现了简单的shell来管理...

    Linux服务器配置与管理:Linux字符界面shell使用.pptx

    其中命令名、选项、参数之间使用空格隔开,多余的空格将被忽略,而用方括号括起来的部分表明该项是可省略的,如直接在提示符后面输入命令date,显示当前的日期和时间。下面介绍命令各组成部分的含义和作用。 (1)命令名...

    Unixize文件名-替换文件名中令人讨厌的反Unix字符-Linux开发

    例如,空格和括号由shell特殊处理。 unf重命名了这些文件,因此,当使用Windows的朋友向您发送名称令人讨厌的zip文件时,您就不必再烦恼了。 使用载货安装install unf这将安装到〜/ .cargo / bin,因此请确保该文件...

    Shell 文件包含

    filename # 注意点号(.)和文件名中间有一空格 或 source filename 实例 创建两个 shell 脚本文件。 test1.sh 代码如下: #!/bin/bash # author:软件开发网 # url:www.mscto.com url=”http://www.mscto.com” test...

    PowerShell命令中包含空格如何运行?

    包括.exe结尾的、.com结尾的可执行程序,包括.bat结尾的、.cmd结尾的批处理程序,还有.vbs结尾的、.ps1结尾的脚本程序。均可以使用如下方式运行程序: <程序文件名>.<后缀> [参数列表] 但是请注意,这里的<...

    LINUX/UNIX Shell编程大作业

     必须包含你的姓名,学生号以及你的SHELL脚本文件如何使用的简介。你还必须确认在Bash SHELL中可以运行你的脚本文件。为了使你的脚本文件输出更具有可读性,请在合适的地方用”\n”和注释。还要考虑脚本的结构和...

    使用C语言编写一个Linux的外壳Shell(操作系统课程)【100012094】

    编写一个C语言程序作为Linux内核的shell命令行解释程序,所执行的结果需和系统命令行方式保持一致。 增加后台运行功能。即用户可以使用”&”作为一个命令结束,以启动下一个命令。 增加I/O重定向功能。即用户可以...

    Shell编程之特殊变量和扩展变量详解

    $0:获取当前执行的Shell脚本的文件名,如脚本中包含路径,则输出也包括路径 $n:获取当前执行的Shell脚本的第n个参数值,如n>9,则需要使用用大括号,如${10},各参数间用空格进行分隔 $#:获取当前执行的Shell脚本...

    python-unix-shell

    python-unix-shell 外壳特点: 上下箭头可用于浏览命令历史记录 选项卡可用于自动完成文件名 支持重定向,并且管道在命令之间使用空格进行重定向和管道示例1: 有效语法=> ls | 厕所使用有效语法=> ls | wc 示例2:...

    Linux系统指令:文件内容查询工具Grep

    如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。Grep可用于shell脚本,因为Grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不...

    Bash命令,用于将文件名和目录转换为Web友好格式。-Linux开发

    Bash命令:Slugify Slugify是一个bash命令,它将文件名和目录转换为Web友好格式。... -a:删除紧邻破折号的空格-c:将连续空格合并为单个空格-d:用破折号替换空格(而不是默认下划线)-h:帮助-i :忽略大小写-n:干燥

    文本三剑客之grep及正则表达式 -.pdf

    如果模板包括空格,则必须被引用,模板后的所有字符串被 看作文件名。搜索的结果被送到标准输出,不影响原文件内容。 3. grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则...

    nws-cli:Unix CLI,用于规范文本中的空格

    此类别中的各个模式仅在处理多行输入方面有所不同。 可以通过文件名参数或通过stdin提供输入。 选项-i提供就地更新。 请参阅下面的示例,在下面进一步获取简洁的信息,或阅读手册。 例子 音译示例 # Converts a...

Global site tag (gtag.js) - Google Analytics