bash有空格的文件名

http://www.keakon.net/2011/10/20/bash%E4%B8%8B%E5%A4%84%E7%90%86%E5%8C%85%E5%90%AB%E7%A9%BA%E6%A0%BC%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D

例如,我在当前文件夹下建立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

可以看到,文件名被分开了。

复制操作也不行:

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
时间: 2024-07-29 07:11:23

bash有空格的文件名的相关文章

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

最近在学Gradle, 使用git clone 命令下载了一些资料,但是文件名含有空格,看上去不是很舒服,因此想到用shell脚本对其进行批处理,去掉文件名中的空格,注意这里是把所有的空格全去掉 git clone https://github.com/waylau/Gradle-2-User-Guide-Demos.git Shell脚本: ######################################################################### # F

bash的基本特性之文件名通配 及IO重定向,管道详解

本篇博文依然涉及到bash的基本特性 文件名通配,并讲解IO重定向以及管道的使用 管道配合tr命令的应用 bash的基础特性之一:文件名通配 globbing:文件名通配(整体文件名匹配,而非部分) 匹配模式:元字符 *:匹配任意长度的任意字符 pa*,*pa*,*pa,*p*a* ?:匹配任意单个字符 pa?,??pa,p?a,p?a? []:匹配指定范围内的任意单个字符 有几种特殊字符: [a-z],[A-Z],[0-9],[a-z0-9] [[:upper:]]:所有大写字母 [[:low

MATLAB检查指定路径中的子文件夹中的文件名中是否带有空格

测试文件夹为: clear;close all;clc; %% %程序实现的功能 %检查指定路径中的子文件夹中的文件名中是否带有空格,并去掉文件名中的空格 %% %程序中用到的之前不清楚的函数如下 %1)strfind(a,b):即找a中是否有b,如果a中有b,则输出b的位置序号.没有输出空数组 %2)isempty(a):判断数组是否为空 %3)strrep(a,b,c):就是把a中所有出现的b换为c %4)movefile(a,b):a移动为b,如C:\test1.jpg移动为C\test2

bash的基础特性二

1.命令别名 alias是命令别名命令,在生产环境根据常用的命令,可以制作为命令别名,可以提高操作效率 alias:打开当前bash的所有命令别名 定义别名:alias 别名='执行的命令' 注:在命令行中定义的命令别名,命令别名只对当前的shell有作用,如果要永久有效,就要到配置文件中去定义: 对当前用户有效:~/.bashrc 对所有用户都有效:/etc/bashrc 在定义完成配置文件后,要重新加载配置文件,才会有效 重新加载配置文件方法: .  ~/.bashrc source ~/.

Linux之linux bash scripts

进程是程序运行时的内存空间和设置,存在于用户空间:用户空间是存放运行的程序和它们的数据的一部分内存空间.shell是用户和Linux内核之间的接口程序,围绕内核的外层.当从shell或其他程序向Linux传递命令时,内核会做出相应的反应.shell也是一个解释型的程序设计语言,支持绝大多数在高级语言中能见到的程序元素,如数据变量.参数传递.判断.流程控制.数据输入和输出,子程序及以中断处理等. shell程序的编译过程分为预处理.编译.汇编.链接等几个阶段 大致的执行过程,图示:        

Bash脚本编程——基础特性

1.命令别名(alias) 1.1 alias命令实现 (1) alias  显示当前shell进程所有可用的命令别名: (2) alias NAME='VALUE'  定义别名NAME,其相当于执行命令VALUE: 注意:在命令行中定义的别名,仅对当前shell进程有效:如果想永久有效,要定义在配置文件中.仅对当前用户:~/.bashrc,对所有用户有效:/etc/bashrc. Note: 编辑配置给出的新配置不会立即生效: bash进程重新读取配置文件: source /path/to/c

Bash的24个陷阱分析

1. for i in `ls *.mp3` 常见的错误写法: for i in `ls *.mp3`; do # Wrong! 为什么错误呢?因为for...in语句是按照空白来分词的,包含空格的文件名会被拆 成多个词.如遇到 01 - Don't Eat the Yellow Snow.mp3 时,i的值会依次取 01,-,Don't,等等. 用双引号也不行,它会将ls *.mp3的全部结果当成一个词来处理. for i in "`ls *.mp3`"; do # Wrong! 正

bash 特性详解需整理

Bash介绍: Bash(GNU Bourne-Again SHell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh.csh.ash.bsh.ksh等 等,Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通常可以在很多种Shell上使用 BASH的正确缩写: BASH = GNU Bourne-Again SHell,BASH 是 GNU 组织开发和推广的一个

linux bash shell中for的用法and示例

关于linux bash shell中的for语句 在linux中shell是必不可少的一部分,但是在bash shell中有while,for,until等循环命令,今天就介绍一下关于for的一些用法.文中任何错误希望大佬们一一指出,不胜感激. bash shell中提供了for命令,用于创建通过一系列值重复的循环,每次重复使用系列中的一个值执行一个定义的命令集. for语句的基本格式如下: for---in list do commands done 在参数list中提供一系列用于迭代(上一