`

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脚本开发过程中,经常会遇到文件名中包含空格的情况。这种情况下,如果处理不当,可能会导致脚本无法正确识别文件名,从而引发一系列的问题。本文将通过一个具体...

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

    在编写Bash脚本时,有时我们可能会遇到文件名或路径中包含空格的情况,这在处理批处理任务时会带来挑战。本文将详细介绍如何在Bash脚本中正确处理这些带有空格的变量。 首先,问题出在当Bash默认使用内部字段分隔符...

    传带空格的命令行参数

    在探讨如何传递包含空格的命令行参数时,我们首先需要理解命令行参数的基本概念以及在实际编程场景中如何正确地处理这些参数。本篇内容将深入解析如何在不同的编程环境中处理带有空格的命令行参数,并通过示例来解决...

    shell模糊匹配与正则详解

    这段脚本检查输入的文件名是否以`#`开头,后跟数字,接着是`-`,然后是`docs`、`unittest`、`pseudocode`或以`msg-`开头且不包含空格的字符串。如果不满足这些条件,脚本会输出错误信息。 总结来说,Shell模糊匹配...

    批量替换文件名中的字符

    在大多数操作系统中,文件名不能包含某些特殊字符,如":"、"/"、"\\"、"|"、"*"、"?"、"\"、">"、"等,因为这些字符在文件系统中具有特殊含义。在本例中,我们关注的是替换文件名中的"#"字符。在某些情况下,"#"可能...

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

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

    Linux shell利用sed如何批量更改文件名详解

    #### 处理含有空格的文件名 当文件名中含有空格时,直接使用上述方法可能会导致错误。此时,可以通过改变 `IFS` (Internal Field Separator) 的值来解决这一问题。 ```bash IFS=$'\n' for file in $(ls) do # ...

    DEDECMS5.7后台getshell1

    其次,该函数使用trim函数来删除文件名中的空格和其他特殊字符,但是该函数也没有正确地处理特殊字符的情况。 漏洞利用 攻击者可以通过上传一个特殊构造的文件来利用该漏洞。例如,攻击者可以上传一个名为"1.jpg?p...

    shell脚本与Makefile区别.docx

    此外,shell 中 = 变量不允许有空格,而 Makefile 中 = 两边允许有空格。这两种语法的不同使得它们在不同的环境中使用。 在 Makefile 中,shell 语法有一些特殊性。例如,在 Makefile 文件的目标项冒号后的另起一行...

    模拟的shell程序

    首先,"shell(含cd).c"和"shell.c"这两个文件名暗示了我们要实现的是一个包含`cd`命令功能的shell模拟器。`cd`命令是改变工作目录的命令,它是shell中的核心组成部分,用于在文件系统中导航。 **模拟shell程序的...

    shell特殊变量

    1. `$0`: 这个变量存储的是当前正在执行的shell脚本的文件名。它对于调试和识别脚本来源非常有用,特别是在编写复杂的shell程序时。 2. `$n` (n为数字): 这些变量用于访问传递给脚本或函数的参数。例如,`$1`表示第...

    linux 修改文件名.docx

    Linux系统允许文件名包含各种字符,包括字母、数字、下划线以及其他特殊字符。特殊字符可能包括减号“-”、点号“.”、空格等。当文件名中包含如减号“-”这类特殊字符时,若不注意,可能在执行删除或修改命令时引发...

    shell学习,第一章

    Shell学习第一章主要涵盖了Shell脚本语言的基础知识,包括Shell的介绍、基本语法、变量和字符串操作等内容。以下是对这些知识点的详细阐述: 1. **Shell介绍**:Shell是一种命令行解释器,它允许用户与操作系统进行...

Global site tag (gtag.js) - Google Analytics