0

我在目录中有许多 txt 文件(>100)。我想压缩文件中包含某些文本的所有文件。我试过

for z in `grep -lr "some-string" .`
do 
  zip -g upload.zip $z; 
done

但它给出了错误,因为文件名包含空格。如何做到这一点?

4

2 回答 2

8

处理文件名中的空格、换行符和其他奇怪字符的最安全方法是使用-Z选项在文件名之间输出零字节以分隔它们。然后,您可以使用xargs将文件传递给zip.

grep -lrZ "some-string" . | xargs -0 zip -g upload.zip
于 2012-12-14T09:08:46.643 回答
2

从不写

for file in <command>

因为它不适用于包含空格的文件名。如果您需要循环从某个命令输出的文件名列表,请这样做:

<command> |
while IFS= read -r file

对于包含换行符的文件名,它仍然会失败,但这些文件名很少见,应该修复为不包含换行符。

所以,而不是:

for z in `grep -lr "some-string" .`
do 
  zip -g upload.zip $z; 
done

你会写:

grep -lr "some-string" . |
while IFS= read -r z
do 
  zip -g upload.zip "$z"
done

我还在 $z 周围添加了引号。总是引用你的 shell 变量,除非你有一个非常好的、明确的理由不和完全理解所有后果(包括在包含空格和/或通配符的文件名上失败)。

于 2012-12-14T16:00:44.337 回答