递归地压缩dir中的每个文件,其中文件的名称中包含空格

时间:2012-12-25 09:58:53

标签: sh

我很困惑;我需要压缩文件夹的内容,我有多个文件(扩展名.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或者在其中有空格并不重要,我在手册页中找不到答案(如果有任何在那里)。

任何人都知道我为什么会遇到这种行为以及如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

你需要引用任何带空格的东西。

zip "$i.zip" "$i"

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