shell 如何处理带有空格的文件名
# 1. 目标
在对资料进行总结和整理时,我习惯以“序号 + 空格 + 类别”的方式对文件夹进行命名,如下所示。

现在,我要将各目录压缩为 tar.gz 格式,然后上传到我的网盘中。首选的实现方式是使用 shell 脚本。
version 1:
#!/bin/sh
for file in `ls .`
do
tar cvf ${file}.tar.gz ${file}
done
运行结果:

从结果来看,由于文件名中空格的存在,一个文件名被分为了两个。所以,要想办法避免 shell 按空格分离字符串。
2. shell 中的 IFS
shell 中有一个叫做 Internal Field Seprator 的变量,简称 IFS,译为内置分隔符。终端下通过 set | grep IFS 可以看到该变量的默认值是空格,制表符和换行符。也就是说 shell 会默认以上述三种字符对字符串进行分隔。这样就不难理解上述脚本将一个文件名分为两个的原因了。

3. 实现
所以,将 IFS 中的空格去掉,文件名就不会被分开了。
version 2:
#!/bin/sh
IFS=$'\t\n'
for file in `ls .`
do
tar cvf ${file}.tar.gz ${file}
done
运行结果:

4. 总结
通过对 IFS 重新赋值可以重新定义 shell 中对字符串的默认分隔符。
IFS=$'\t\n'
浙公网安备 33010602011771号