shell 如何处理带有空格的文件名

# 1. 目标

在对资料进行总结和整理时,我习惯以“序号 + 空格 + 类别”的方式对文件夹进行命名,如下所示。

image-20230717113229428

现在,我要将各目录压缩为 tar.gz 格式,然后上传到我的网盘中。首选的实现方式是使用 shell 脚本。

version 1:

#!/bin/sh

for file in `ls .`
    do
        tar cvf ${file}.tar.gz ${file}
    done

运行结果:

image-20230717113329627

从结果来看,由于文件名中空格的存在,一个文件名被分为了两个。所以,要想办法避免 shell 按空格分离字符串

2. shell 中的 IFS

shell 中有一个叫做 Internal Field Seprator 的变量,简称 IFS,译为内置分隔符。终端下通过 set | grep IFS 可以看到该变量的默认值是空格,制表符和换行符。也就是说 shell 会默认以上述三种字符对字符串进行分隔。这样就不难理解上述脚本将一个文件名分为两个的原因了。

image-20230717113409843

3. 实现

所以,将 IFS 中的空格去掉,文件名就不会被分开了

version 2:

#!/bin/sh

IFS=$'\t\n'

for file in `ls .`
    do
        tar cvf ${file}.tar.gz ${file}
    done

运行结果:

image-20230717113504674

4. 总结

通过对 IFS 重新赋值可以重新定义 shell 中对字符串的默认分隔符。

IFS=$'\t\n'
posted @ 2023-07-17 11:38  寻梦99  阅读(686)  评论(0)    收藏  举报