1

我很困惑;我需要压缩一个文件夹的内容,其中有多个文件(扩展名 .dat)。我去了shell脚本。

到目前为止,我告诉自己这并不难:我只需要递归读取目录的内容,获取文件名并使用文件本身的名称压缩它。

这是我写的:

for i in *.dat; do zip $i".zip" $i; done

现在,当我尝试它时,我得到了一个奇怪的行为:每个文件都被称为“12/23/2012 data102 test1.dat”;当我运行这一系列命令时;我看到该 zip 而不是识别整个文件名,而是将字符串的每个部分视为单个实体,从而导致整个操作失败。

我告诉自己我做错了什么,而 i 变量是错误的;所以我替换了 echo,而不是 zip 命令(查看哪个是 i 变量的输出);$i 输出是文件的全名,而不是文件的一部分。

在这一点上,我完全不知道发生了什么......如果变量 i 是通过 zip 读取的,它会读取字符串的每一个片段,而不是整个字符串,而如果我使用 echo 来查看该变量的内容它得到正确的输出。

我是否必须以不同的方式将文件名的值传递给 zip?由于它是作为参数传递的变量的内容,我假设字符串是 1 还是其中有空格都没有关系,并且我在手册页中找不到答案(如果那里有)。

任何人都知道我为什么会出现这种行为以及如何解决它?谢谢!

4

1 回答 1

1

您需要引用任何带有空格的内容。

zip "$i.zip" "$i"

一般来说,任何变量插值都应该有双引号,除非您特别要求 shell 将其拆分为多个标记。内部字段分隔符$IFS默认为空格和制表符,但您可以更改它以使外壳在任意分隔符上进行分词。有关 shell 引用机制的详细说明,请参阅任何体面的初学者 shell 教程。

于 2012-12-25T10:12:52.557 回答