我在目录中有许多 txt 文件(>100)。我想压缩文件中包含某些文本的所有文件。我试过
for z in `grep -lr "some-string" .`
do
zip -g upload.zip $z;
done
但它给出了错误,因为文件名包含空格。如何做到这一点?
处理文件名中的空格、换行符和其他奇怪字符的最安全方法是使用-Z
选项在文件名之间输出零字节以分隔它们。然后,您可以使用xargs
将文件传递给zip
.
grep -lrZ "some-string" . | xargs -0 zip -g upload.zip
从不写
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 变量,除非你有一个非常好的、明确的理由不和完全理解所有后果(包括在包含空格和/或通配符的文件名上失败)。